为什么 clang 和 gcc 以不同的方式处理具有 in-class 初始化的结构的支撑初始化?

Why do clang and gcc handle braced-initialization of structs with in-class initialization differently?

我最近发现了 clang 和 gcc 的一个奇怪行为。我有一个结构 (MyClass),它对其成员之一 (active) 使用 in-class 初始化:

struct MyClass {
  int something;
  bool active = true;
};

现在我尝试用大括号初始化这个class。

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

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

 error: could not convert ‘{42, true}’ from ‘<brace-enclosed initializer list>’ to ‘MyClass’

这是一个错误吗?标准对此有何规定? VSC++呢?您会推荐哪种方式作为便携式解决方案?

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

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

在 C++11 中,= true 的存在意味着 class 不是聚合。因此你不能使用聚合初始化。

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

编译器之间的差异可以用一个比另一个更新来解释。使用 compiler explorer 我看到 gcc 4.9.x 弄错了,但这在 gcc 5.1 中得到了修复。