考虑以下代码:
struct S
{
int x;
double y = 1.1;
};
int main()
{
S s = {0};
}
根据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};
另一方面,clang ++编译它。
这是g ++的已知问题吗?
答案 0 :(得分:5)
你是对的,这是有效的C ++ 14;但是,在C ++ 11中有一个in class member initializers was not an aggregate的类,所以这在C ++ 11中无效。
我在上述问题的回答中提到的问题,我在做出初步评论后发现,gcc did not support this change until 5.0( see it live ):
G ++现在支持使用非静态数据成员的C ++ 14聚合 初始化。
struct A { int i, j = i; }; A a = { 42 }; // a.j is also 42