我最近发现了clang和gcc的奇怪行为。我有一个结构(MyClass
),它为其中一个成员(active
)使用类内初始化:
struct MyClass {
int something;
bool active = true;
};
现在我尝试用括号初始化这个类。
使用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 Linux上使用gcc 4.9和clang 3.5进行测试。
答案 0 :(得分:8)
此代码的行为在C ++ 11和C ++ 14之间发生了变化。
在C ++ 11中,= true
的存在意味着该类不是聚合。因此,您无法使用聚合初始化。
在C ++ 14中,类仍然是聚合,因此您可以再次使用聚合初始化。
编译器之间的区别可以解释为一个比另一个更新。使用compiler explorer我看到gcc 4.9.x错了,但这在gcc 5.1中得到修复。