以下代码被clang 6.0.0接受但被gcc 8.2拒绝
enum class E {
Good, Bad,
};
struct S {
E e : 2;
int dummy;
};
S f() {
return {E::Good, 100};
}
GCC 提示
error: could not convert '
{Good, 100}
' from '<brace-enclosed initializer list>
' to 'S
'
哪一个是正确的?标准中哪里谈到了这种情况?
最佳答案
return {E::Good, 100};
执行 copy list initialization的返回值。此列表初始化的效果是 aggregate initialization .
那么 S
是一个聚合体吗? aggregate 的描述根据您使用的 C++ 版本而有所不同,但在所有情况下 S
都应该是一个聚合,因此应该可以编译。 Clang(和 MSVC)具有正确的行为。
不过,修复很简单。更改您的 return 语句以返回正确类型的对象:
return S{E::Good, 100};
关于c++ - 枚举位域和聚合初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52194486/