Как я должен скопировать инициализацию std:: array из std:: pairs?

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

Ошибка VS2013:

ошибка C2440: 'initializing': невозможно преобразовать из 'int' в 'std:: pair' Нет конструктора, который мог бы взять тип источника, или разрешение перегрузки конструктора было неоднозначным`

Что я делаю неправильно?

Ответы

Ответ 1

Добавьте еще одну пару фигурных скобок.

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

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

Ответ 2

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

2 Когда агрегат инициализируется списком инициализаторов, как указанных в 8.5.4, элементы списка инициализаторов берутся как инициализаторы для членов агрегата, увеличивая индекс или порядок членов

Итак, эта запись

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

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

Элемент данных 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 } } };