Gcc 4.9 ошибка в инициализации структур?

У меня есть код:

struct A {
    int a;
};

struct B {
    int b;
    const A a[2];
};

struct C {
    int c;
    const B b[2];
};

const C test = {0, {}};

int main()
{
    return test.c;
}

У меня есть gcc 4.8.2 и 4.9.2. Его можно скомпилировать с помощью:

g++-4.9 -Wall test.cpp -o test
g++-4.8 -std=c++11 -Wall test.cpp -o test
g++-4.8 -Wall test.cpp -o test

Однако он не может быть скомпилирован с помощью:

g++-4.9 -std=c++11 -Wall test.cpp -o test

И вывод компилятора:

test.cpp:15:22: error: uninitialized const member ‘B::a’
 const C test = {0, {}};
                      ^
test.cpp:15:22: error: uninitialized const member ‘B::a’

Является ли это ошибкой, или я просто ничего не понимаю?

Ответ 1

Это ошибка, которая по существу сводится к тому, что GCC жалуется на неявно инициализированные члены данных const в агрегатной инициализации. Например.

struct {const int i;} bar = {};

Отказывается, поскольку в bar в инициализаторе bar нет инициализатора-предложения для i. Однако стандарт указывает в §8.5.1/7, что

Если в списке меньше предложений инициализатора, чем членов в совокупности, то каждый элемент явно не инициализирован должен быть инициализирован из своего элемента управления выравниванием или равным или, если не является символом-равным-инициализатором, из пустого списка инициализаторов (8.5.4).

Таким образом, код инициализирует i (как будто на = {}), а жалоба GCC неверна.

Фактически эта ошибка уже сообщалась четыре года назад как # 49132 и исправлена ​​в GCC 5.