我最近发现了clang和gcc的奇怪行为。我有一个struct(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进行了测试。
此代码的行为在C ++ 11和C ++ 14之间发生了变化。
在C ++ 11中,存在的= true
意思是该类不是聚合的。因此,您不能使用聚合初始化。
在C ++ 14中,该类仍然是聚合的,因此您可以再次使用聚合初始化。
编译器之间的差异可以用一个比另一个更新来解释。使用编译器浏览器,我看到gcc 4.9.x弄错了,但这在gcc 5.1中已修复。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句