c++ - 枚举位域和聚合初始化

标签 c++ c++11 language-lawyer bit-fields enum-class

以下代码被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};
}

Live godbolt example

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/

相关文章:

c++ - 计算导致段错误的 std::vector<double> 的中值

C++11 正则表达式抛出 std::regex_error

g++ 中的 C++11 链式构造合规性

c++ - 我的基于可变参数模板的包装函数有什么问题?

c - 标准 C 中的约束是什么?

c++ - 为什么结构和类定义可以在多个翻译单元上重复?

c++ - 在 google::dense_hash_map 中存储 std::vectors 使其变慢

c++ - 轻量级C++图像库

c++ - 如何压缩日志文件?

带和不带指针声明符的 C++11 自动声明