2014-12-27 4 views

ответ

17

Добавить еще пару брекетов.

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } }; 

std::array<T, N> представляет собой совокупность класс, содержащий элемент типа T[N]. Как правило, вы можете инициализировать так же, как и обычный массив T[N], но когда вы имеете дело с типом неагрегационного элемента, вам может потребоваться более явное.

+0

Это, кажется, все объясняет, пока вы не посмотрите на ответ Йоахима, используя 'std :: make_pair'. Как работает _that_ без дополнительной пары охватывающих брекетов? – TonyK

+0

@TonyK В общем случае фигурные скобки можно опустить. 'int a [2] [2] = {0, 1, 2, 3};' отлично. Но когда вы имеете дело с классами с конструкторами, предоставляемыми пользователем, все становится немного сложнее: '{0, 1}' может быть попыткой инициализировать первый элемент или первый подэлемент. Неопределенность разрешается в пользу первого элемента. С другой стороны, результат 'make_pair' может использоваться только для инициализации первого подэлемента. – hvd

+0

Единственным стандартом, гарантирующим работу, является «' array a = {initializer-list}; 'where * initializer-list * - список разделенных запятыми элементов' N', типы которых можно конвертировать в 'T' ». Дополнительная пара фигурных скобок, вероятно, будет работать на всех текущих реализациях, но не гарантируется. –

13

std::array - это совокупность. Он имеет только один элемент данных - массив указанного типа специализации std::array. Согласно стандарту C++. (8.5.1 Заполнителей)

2 When an aggregate is initialized by an initializer list, as specified in 8.5.4, the elements of the initializer list are taken as initializers for the members of the aggregate, in increasing subscript or member order

Так эта запись

std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } }; 

имеет больше инициализаторов то есть элементы данных в станде :: массиве.

Элемент данных std::array в свою очередь представляет собой совокупность. Вы должны указать для него список инициализаторов.

Так что запись будет выглядеть

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } }; 

Ибо будет более ясно, что вы можете себе представить инициализацию следующим образом

std::array<std::pair<int, int>, 2> ids = { /* an initializer for data member of the array */ }; 

Как элемент данных агрегатный, то вы должны написать

std::array<std::pair<int, int>, 2> ids = { { /* initializers for the aggregate data member*/ } }; 

И наконец

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } }; 
+2

Если вы идете по стандарту, то нет гарантии, что 'std :: array' имеет только один элемент данных. –

+0

@ T.C. Без этой информации вы не можете правильно инициализировать массив. По крайней мере, для изложения стандарт включает в определение массива следующий член данных T elems [N]; –

+0

Стандарт гарантирует, что 'array a = {initializer-list};' будет работать, если список initializer имеет до N элементов, каждый из которых конвертируется в 'T'. Нет гарантии, что встроенный массив (если он используется - я не знаю, можно ли выполнить все требования без использования одного) - это единственный элемент данных. –