Использование std :: array со списками инициализации - PullRequest
54 голосов
/ 19 ноября 2011

Если я не ошибаюсь, можно создать массив std: следующим образом:

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 C ++ Library глупа?

Ответы [ 2 ]

85 голосов
/ 19 ноября 2011

std::array это смешно. Это определяется в основном так:

template<typename T, int size>
struct std::array
{
  T a[size];
};

Это структура, которая содержит массив. У него нет конструктора, который принимает список инициализатора. Но std::array является агрегатом по правилам C ++ 11, и поэтому он может быть создан путем инициализации агрегата. Для агрегирования инициализации массива внутри структуры вам понадобится второй набор фигурных скобок:

std::array<std::string, 2> strings = {{ "a", "b" }};

Обратите внимание, что стандарт предлагает исключить дополнительные скобки в этом случае. Так что, скорее всего, это ошибка GCC.

11 голосов
/ 27 сентября 2012

Добавить к принятому ответу:

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.

...