C ++ 11: правильная инициализация std :: array?

Если я инициализирую std :: array следующим образом, компилятор выдаст мне предупреждение об отсутствующих фигурных скобках

std::array<int, 4> a = {1, 2, 3, 4};

Это решает проблему:

std::array<int, 4> a = {{1, 2, 3, 4}};

Это предупреждающее сообщение:

missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces]

Это просто ошибка в моей версии gcc, или это сделано намеренно? Если так, то почему?

50

Решение

Это голая реализация std::array:

template<typename T, std::size_t N>
struct array {
T __array_impl[N];
};

Это агрегатная структура, единственным элементом данных которой является традиционный массив, такой что внутренний {} используется для инициализации внутреннего массива.

Исключение скобок допускается в некоторых случаях при общей инициализации (но обычно не рекомендуется), поэтому в этом случае может использоваться только одна скобка. Посмотреть здесь: C ++ вектор массивов

43

Другие решения

В соответствии с cppreference. Двойные скобки требуются только если = опущен

// construction uses aggregate initialization
std::array<int, 3> a1{ {1,2,3} };    // double-braces required
std::array<int, 3> a2 = {1, 2, 3}; // except after =
std::array<std::string, 2> a3 = { {std::string("a"), "b"} };
28

Двойные скобки требуются в C ++ 11, но не начиная с C ++ 14:

// construction uses aggregate initialization
std::array<int, 3> a1{ {1, 2, 3} }; // double-braces required in C++11 (not in C++14)
std::array<int, 3> a2 = {1, 2, 3};  // never required after =

std :: ссылка на массив

3
По вопросам рекламы [email protected]