Как я должен инициализировать boost :: array? - PullRequest
14 голосов
/ 22 апреля 2010

Я пытаюсь понять массив boost . Код можно легко прочитать с сайта автора.

В обосновании дизайна автор (Николай М. Йосуттис) упомянул, что возможны следующие два типа инициализации.

boost::array<int,4> a = { { 1, 2, 3 } };  // Line 1
boost::array<int,4> a = { 1, 2, 3 };      // Line 2

В моем эксперименте с g ++ (версия 4.1.2) строка 1 работает, а строка 2 - нет. (Строка 2 дает следующее:

warning: missing braces around initializer for 'int [4]'
warning: missing initializer for member 'boost::array<int, 4ul>::elems'

)

Тем не менее, мой главный вопрос, как работает Линия 1? Я пытался написать класс, похожий на array.hpp, и использовать оператор, такой как строка 1, но это не сработало :-(. Ошибка

typedef array< unsigned int, 10 > MyArray;

MyArray b = { { 1, 2, 3 } };  // Line 74

array_test.cpp:74: error: in C++98 'b' must be initialized by constructor, not by '{...}'
array_test.cpp:74: error: no matching function for call to 'array<unsigned int, 10u>::array(<brace-enclosed initializer list>)'
array.h:16: note: candidates are: array<unsigned int, 10u>::array()
array.h:16: note:                 array<unsigned int, 10u>::array(const array<unsigned int, 10u>&)

Может кто-нибудь объяснить мне? Есть ли что-то особенное в линии 1, что мне нужно знать?

Ответы [ 2 ]

20 голосов
/ 22 апреля 2010

это обычный список инициализации фигурной скобки:

Массив Boost определяется следующим образом:

struct array { T elems[N]; };

внутренняя скобка для инициализации массива элементов, внешняя скобка для инициализации структуры. Если вы предоставляете свой собственный конструктор, у вас больше нет простого старого типа данных, который невозможно инициализировать с помощью скобки

обратите внимание, что вы можете обойтись без внешней скобки, но вы получите предупреждение

9 голосов
/ 22 апреля 2010

Соответствующий раздел стандарта - §8.5.1, агрегаты.

  1. Агрегат - это массив или класс (раздел 9) без объявления пользователя конструкторы (12.1), не частные или Защищенные нестатические члены данных (пункт 11), без базовых классов (пункт 10) и без виртуальных функций (10.3).
  2. Когда агрегат инициализируется, инициализатор может содержать инициализатор-предложение, состоящее из в скобках, список через запятую инициализаторов-предложений для участников совокупности, написанной в увеличение индекса или порядка членов. Если агрегат содержит субагрегаты, это правило применяется рекурсивно членам субагрегата.

GCC 4.1.2 может нарушать пункт 11.

11 Брекеты могут быть исключены в список инициализаторов следующим образом. Если список инициализаторов начинается с левого скобка, то последующий список инициализаторов через запятую инициализирует членов subaggregate; это ошибочно для там должно быть больше инициализаторов, чем члены. Если, однако, список инициализатора для субагрегата не начинается с левой скобки, то достаточно только инициализаторов из списка принимаются для инициализации членов субагрегат; любой оставшийся инициализаторы оставлены для инициализации следующий член совокупности который текущий субагрегат является член.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...