Использование std:: array с списками инициализации
Если я ошибаюсь, должно быть возможно создать массив std: {/p >
std::array<std::string, 2> strings = { "a", "b" };
std::array<std::string, 2> strings({ "a", "b" });
И все же, используя GCC 4.6.1, я не могу заставить их работать. Компилятор просто говорит:
expected primary-expression before ',' token
и все же списки инициализации работают нормально с std::vector. Так что это? Я ошибаюсь, думая, что std:: array должен принимать списки инициализации, или команда GNU Standard С++ Library goofed?
Ответы
Ответ 1
std::array
смешно. Он определяется в основном следующим образом:
template<typename T, int size>
struct std::array
{
T a[size];
};
Это структура, содержащая массив. Он не имеет конструктора, который принимает список инициализаторов. Но std::array
является агрегатом по правилам С++ 11, и поэтому он может быть создан путем агрегатной инициализации. Чтобы агрегировать инициализацию массива внутри структуры, вам понадобится второй набор фигурных скобок:
std::array<std::string, 2> strings = {{ "a", "b" }};
Обратите внимание, что стандарт указывает на то, что в этом случае можно удалить дополнительные фигурные скобки. Вероятно, это ошибка GCC.
Ответ 2
Чтобы добавить к принятому ответу:
std::array<char, 2> a1{'a', 'b'};
std::array<char, 2> a2 = {'a', 'b'};
std::array<char, 2> a3{{'a', 'b'}};
std::array<char, 2> a4 = {{'a', 'b'}};
все работают на GCC 4.6.3 (Xubuntu 12.01). Тем не менее,
void f(std::array<char, 2> a)
{
}
//f({'a', 'b'}); //doesn't compile
f({{'a', 'b'}});
для этого требуется двойная фигурная скобка. Версия с одиночными скобками приводит к следующей ошибке:
../src/main.cc: In function ‘int main(int, char**)’:
../src/main.cc:23:17: error: could not convert ‘{'a', 'b'}’ from ‘<brace-enclosed initializer list>’ to ‘std::array<char, 2ul>’
Я не уверен, какой аспект типа вывода/преобразования делает работу таким образом, или если это причуда реализации GCC.