g ++ 4.9拒绝C ++ 14中的有效聚合初始化

时间:2015-01-23 15:57:09

标签: c++ g++ c++14

考虑以下代码:

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 ++的已知问题吗?

1 个答案:

答案 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