为什么clang和gcc使用类内初始化来处理结构的粗略初始化?

use*_*240 7 c++ gcc clang c++11 c++14

我最近发现了clang和gcc的奇怪行为.我有一个struct(MyClass),它为其中一个成员(active)使用类内初始化:

struct MyClass {
  int something;
  bool active = true;
};
Run Code Online (Sandbox Code Playgroud)

现在我尝试对这个类进行大括号初始化.

使用clang,我可以决定是否包含active在初始化列表(MyClass a = { 42, true};)中或不包含(MyClass a = { 42 };).

但是使用gcc,我的代码只有在我不包含的情况下编译active.否则,我将得到以下编译器错误:

 error: could not convert ‘{42, true}’ from ‘<brace-enclosed initializer list>’ to ‘MyClass’
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?标准对此有何评价?VSC++怎么样?您推荐哪种方式作为便携式解决方案?

在Debian Linux上使用gcc 4.9和clang 3.5进行测试.

M.M*_*M.M 9

此代码的行为在C++ 11和C++ 14之间发生了变化.

在C++ 11中,存在= true意味着该类不是聚合.因此,您无法使用聚合初始化.

在C++ 14中,类仍然是聚合,因此您可以再次使用聚合初始化.

编译器之间的区别可以解释为一个比另一个更新.使用编译器浏览器我看到gcc 4.9.x弄错了,但这在gcc 5.1中得到修复.