为什么clang和gcc以不同的方式处理结构体的粗略初始化?

时间:2015-12-28 09:15:08

标签: c++ c++11 gcc clang c++14

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

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

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

使用clang,我可以决定是否在初始值设定项列表中添加activeMyClass a = { 42, true};)或不包含MyClass a = { 42 };

但是使用gcc,我的代码只会编译,如果我不包含active。否则,我将得到以下编译器错误:

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

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

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

1 个答案:

答案 0 :(得分:8)

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

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

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

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