Теоретически std::array
следует инициализировать с помощью общей инициализации.Так что на самом деле это:
std::array<int, 3> a {1, 2, 3};
является синтаксическим сахаром для этого:
std::array<int, 3> a {{1, 2, 3}};
Как видите, в первом случае кажется, что я инициализирую массив значениями, но он действительно агрегированинициализация с инициализированным списком.Это ясно как день во второй ситуации.Так что для начала.
Хорошо, так почему же это не работает?
std::array<std::pair<int, int>, 3> b {{1, 11}, {2, 22}, {3, 33}};
Ну, проще говоря - компилятор не может определить, какой тип синтаксиса используется для инициализации массива,{1, 11}
может интерпретироваться как список инициализатора и использовать первую версию, так и в виде пары и идти со второй версией.
Этот код:
std::array<std::pair<int, int>, 3> b {{{1, 11}, {2, 22}, {3, 33}}};.
устраняет неоднозначность.
Источник: http://en.cppreference.com/w/cpp/language/aggregate_initialization