Подтвердить что ты не робот

Использование 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?

4b9b3361

Ответ 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.