为什么这不是有效的 C++?:

enum foo : unsigned { first_foo, second_foo };
enum bar : foo { best_foo = first_foo };

GCC 5.4.0 说:
/tmp/a.cpp:3:16: error: underlying type ‘foo’ of ‘bar’ must be an integral type
     enum bar : foo { best_foo = first_foo };

我可以理解为什么如果 foofloat 或一些结构体或其他什么的,我会得到这个错误。但这在语义、类型安全等方面对我来说似乎完全合法。我错过了什么?

最佳答案

当您向 C++ 添加内容时,您倾向于添加解决问题的最小数量。
enum A:int 语法允许您准确指定 enum A 如何存储为整数。这就是它所做的一切,它解决了问题。
enum A:B 其中 B 是一个枚举可能有很多含义。 A 可以扩展 B ,或者 A 可以是具有不同名称的 B 基础类型的子集,或者 A 可以是严格限制为具有可以存储在 B 中的值的子集的枚举,或者 A 可以是其值的枚举仅限于 B 值的“ shell ”。

其中,“相同的底层类型”解决方案(使用 :int 语法)与 enum A:std::underlying_type_t<B> 一致。所以已经有一种方法可以做到这一点,而且不是特别繁重。

除非有人就 enum A:B 的含义提出建议并说服足够多的委员会,否则不太可能被允许。当有多种不同的合理含义时,这使得选择任何一种含义变得更加困难。人们需要一个强大的用例,为什么一个特定的含义是最好的,以及为什么值得将它放在标准中。

关于c++ - 为什么我不能有一个枚举作为另一个枚举的基础类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40607013/

10-14 15:20
查看更多