为什么clang和gcc处理结构的支持初始化与类内初始化不同



我最近发现了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进行了测试。

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

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

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

编译器之间的差异可以用一个比另一个新来解释。使用编译器资源管理器,我发现gcc 4.9.x出错了,但这在gcc 5.1中得到了修复。

最新更新