Если я инициализирую 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, или это сделано намеренно? Если так, то почему?
Это голая реализация std::array
:
template<typename T, std::size_t N>
struct array {
T __array_impl[N];
};
Это агрегатная структура, единственным элементом данных которой является традиционный массив, такой что внутренний {}
используется для инициализации внутреннего массива.
Исключение скобок допускается в некоторых случаях при общей инициализации (но обычно не рекомендуется), поэтому в этом случае может использоваться только одна скобка. Посмотреть здесь: C ++ вектор массивов
В соответствии с 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"} };
Двойные скобки требуются в 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 =