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

Что случилось с этой встроенной инициализацией std:: array?

Рассмотрим следующее выражение:

#include <array>

struct X
{
    //std::array<bool,3> arr={false,false,false};
    bool brr[3]={false,false,false};
};

Как есть, он обычно компилируется g++ 5.2. Но если я раскомментирую std::array, я получаю сообщение об ошибке:

test.cpp:5:46: error: array must be initialized with a brace-enclosed initializer
     std::array<bool,3> arr={false,false,false};
                                              ^
test.cpp:5:46: error: too many initializers for ‘std::array<bool, 3u>’

OTOH, эта декларация работает без проблем внутри main(). Кроме того, следующая инициализация работает внутри struct X:

std::array<bool,3> arr={{false,false,false}};

Почему я не могу использовать простую инициализацию с единственными фигурными скобками в определении структуры?

4b9b3361

Ответ 1

Это выглядит как ошибка gcc: Ошибка 65815 - в NSDMI не работает команда brace elision. В отчете говорится:

На странице 975 "Язык программирования С++", 4-е издание, Bjarne Строуструп говорит:

"Массив может быть инициализирован списком инициализаторов: array a1 = {1, 2, 3};"

и Clang (V 3.5) принимает его. Однако g++ 4.9.2 считает, что это Ошибка:

"error: array must be initialized with a brace-enclosed initializer
   const std::array<double, 3> _ar0val = {1.0, -1.0, 1.0};"

Проблема была сужена до следующего тестового примера:

struct array {
  int data [2];
};

struct X {
  array a = { 1, 2 };
};

Похоже, что исправление находится в редакции главы, код OPs работает в этой версии, видеть его в прямом эфире.

Как отмечено в отчете об ошибке с использованием внутреннего набора фигурных скобок, это возможный обход:

std::array<bool,3> arr={ {false,false,false} };
                         ^                 ^