为什么 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 中得到了修复。
我最近发现了 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 中得到了修复。