考虑以下代码:
struct S
{
int x;
double y = 1.1;
};
int main()
{
S s = {0};
}
Run Code Online (Sandbox Code Playgroud)
根据C++ 14标准,§8.5.1/ 7
如果列表中的初始化子条款少于聚合中的成员,则未明确初始化的每个成员应从其大括号或等号初始值初始化,或者,如果没有大括号或等号初始值,从空的初始化列表(8.5.4).
代码应该完全有效.
但是,g ++ 4.9.2拒绝代码(编译-std=c++14)
so.cpp:9:13: error: could not convert '{0}' from '<brace-enclosed initializer list>' to 'S'
S s = {0};
Run Code Online (Sandbox Code Playgroud)
另一方面,clang ++编译它.
这是g ++的已知问题吗?
你是对的,这是有效的C++ 14; 但是,在C++ 11 中,类成员初始值设定项中的类不是聚合,因此在C++ 11中无效.
正如我在回答上述问题时所提到的那个问题,我在做出初步评论之后才意识到,gcc在5.0之前不支持这种改变(现场观看):
G ++现在支持使用非静态数据成员初始值设定项的C++ 14聚合.
Run Code Online (Sandbox Code Playgroud)struct A { int i, j = i; }; A a = { 42 }; // a.j is also 42