我有代码:
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’
这是一个错误还是我只是不明白?
答案 0 :(得分:3)
这是一个错误,它本质上减少了GCC抱怨聚合初始化中未明确初始化的const
数据成员。 E.g。
struct {const int i;} bar = {};
Fails因为i
的初始值设定项中没有bar
的初始化子句。但是,该标准在§8.5.1/7
中指定了
如果列表中的 initializer-clauses 少于 聚合中的成员,然后未明确初始化每个成员 应从其大括号或等于初始化程序初始化,或者如果有的话 从空的初始化列表中没有大括号或等于初始化, (8.5.4)强>
因此,代码初始化i
(好像是= {}
),并且GCC投诉不正确。
事实上,这个错误已在四年前作为#49132报告,并在GCC 5中得到修复。