Ответ 1
К сожалению, std::array
не имеет конструктора списка инициализаторов. В самом деле, у него нет никакого определяемого пользователем конструктора - эта "функция" осталась на С++ 03, где исключение всех определяемых пользователем конструкторов было единственным способом включить инициализацию скобки C-стиля. Это IMHO - дефект в текущем стандарте.
Итак, почему в этом случае не работает встроенная инициализация скобок? Посмотрим, как выглядит std::array
под капотом:
template <typename T, int i> struct array {
T data[i];
// ...
}
Итак, не означает ли это, что нам нужно использовать двойные фигурные скобки в инициализаторе (одна пара для array
, еще одна пара для члена data
?
std::array<int, 2> a = { {1, 2} };
C (и, следовательно, С++) имеет специальное правило о выравнивании фигурной скобки, допускающее упущение внутренних скобок, если не существует двусмысленности. array
использует эту функцию, позволяя нам писать
std::array<int, 2> a = { 1, 2 };
Так почему же не работает пример в исходном сообщении? Поскольку выравнивание фигурных скобок разрешено только в контексте инициализации агрегатного типа C, а не в случае чего-то более сложного, например, определяемого пользователем конструктора списка инициализаторов.
Следующее должно работать, однако, как уродливое, как это:
std::vector<std::array<int, 2>> vp = { {{1,2}}, {{3,4}} };
Тот факт, что это не так, по крайней мере на gcc 4.5 и gcc 4.6, мне кажется, указывает на ошибку компилятора. Я не совсем уверен в этом.
Этот вопрос несколько уместен: Как инициализировать массив-член с помощью initializer_list?