为什么我不能将枚举作为另一个枚举的基础类型?

ein*_*ica 2 c++ enums subclassing c++11

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

enum foo : unsigned { first_foo, second_foo };
enum bar : foo { best_foo = first_foo };
Run Code Online (Sandbox Code Playgroud)

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 };
Run Code Online (Sandbox Code Playgroud)

我可以理解为什么我会得到这个错误,如果foo是一个float,或一些结构,或什么不是.但就语义,类型安全等而言,这似乎是完全合法的.我缺少什么?

ild*_*arn 8

C++ 11 [dcl.enum]/2:

类型说明符-SEQ一个的枚举基应命名的组成型; 任何cv资格都被忽略了.

枚举本身不是整数类型 - [basic.fundamental]/7:

类型bool,char,char16_t,char32_t,wchar_t,和符号和无符号整数类型统称为一体的类型.

这附有一个非规范性的脚注:

因此,枚举不是不可或缺的; 但是,枚举可以提升为[conv.prom]中指定的整数类型.

为了达到我认为你正在寻找的效果,仍然很简单:

enum bar : std::underlying_type<foo>::type { best_foo = first_foo };
Run Code Online (Sandbox Code Playgroud)


Yak*_*ont 5

当您向 C++ 添加内容时,您倾向于添加能够解决问题的最小数量。

enum A:int语法允许您准确指定如何enum A将 存储为整数。这就是它所做的一切,它解决了问题。

enum A:BwhereB是一个枚举可以有多种含义。 A可以扩展B,或者A可以是B具有不同名称的基础类型的子集,或者A可以是严格限制为具有可以存储在 中的值的子集的枚举B,或者A可以是其值被限制为“外壳”的枚举的B价值观。

其中,“相同基础类型”解决方案(具有:int语法)与enum A:std::underlying_type_t<B>. 所以已经有一种方法可以做到这一点,而且并不是特别麻烦。

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