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

С++ 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, или это сделано намеренно? Если да, то почему?

4b9b3361

Ответ 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 :: ссылка на массив