К сожалению, std::array
не имеет конструктора списка инициализатора. Действительно, у него есть нет пользовательского конструктора вообще - эта «особенность» является остатком C ++ 03, где исключение всех пользовательских конструкторов было единственным способом включить инициализацию скобки в стиле C. Это ИМХО дефект текущего стандарта.
Так почему же в этом случае не работает встроенная инициализация скобок? Давайте посмотрим, как std::array
выглядит под капотом:
template <typename T, int i> struct array {
T data[i];
// ...
}
Хорошо, не значит ли это, что нам нужно было бы использовать двойные фигурные скобки в инициализаторе (одна пара для array
, другая пара для data
члена?
std::array<int, 2> a = { {1, 2} };
C (и, следовательно, 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?