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

vso*_*tco 4 c++ g++ c++14

考虑以下代码:

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

Sha*_*our 6

你是对的,这是有效的C++ 14; 但是,在C++ 11 中,类成员初始值设定项中的类不是聚合,因此在C++ 11中无效.

正如我在回答上述问题时所提到的那个问题,我在做出初步评论之后才意识到,gcc在5.0之前不支持这种改变(现场观看):

G ++现在支持使用非静态数据成员初始值设定项的C++ 14聚合.

struct A { int i, j = i; };
A a = { 42 }; // a.j is also 42
Run Code Online (Sandbox Code Playgroud)