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