将作用域枚举转换为 int

Posted

技术标签:

【中文标题】将作用域枚举转换为 int【英文标题】:Convert scoped enum to int 【发布时间】:2014-05-08 18:02:00 【问题描述】:

为什么不能将作用域枚举隐式转换为 int?如果我有

enum class Foo:uint32_t...;

然后我知道 Foo 所涵盖的整数是 uint32_t 所涵盖的整数的子集,所以我应该始终是安全的。我在这里错过了一些怪癖吗?但相反的情况并不安全。

【问题讨论】:

这不是他们的重点吗? 【参考方案1】:

正如 LightnessRacesinOrbit 在他的 answer 中解释的那样,作用域枚举的全部目的是禁止隐式转换为基础类型。

您可以通过static_cast 显式转换它们,但如果您想要指定底层类型的能力,同时允许隐式转换,您也可以使用常规枚举执行此操作,只需删除 class 关键字定义。

enum class Foo1 : uint32_t THING ;
enum /*class*/ Foo2 : uint32_t THING ;

uint32_t conv1 = static_cast<uint32_t>(Foo1::THING);
uint32_t conv2 = Foo2::THING;  // <-- implicit conversion!

【讨论】:

我什至不知道您仍然可以指定基础类型。太棒了。【参考方案2】:

仅仅因为这样的转换总是可以成功并不意味着你希望它是隐式的。

作用域枚举的全部目的是它们是不同的类型,在重载决策期间不会导致混淆结果。

明确是好的。

【讨论】:

其实还有一个目的:它们是scoped所以THING需要被限定。 @user877329:当然,虽然在一定的抽象级别上是一样的:)

以上是关于将作用域枚举转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

C语言速记3(作用域,枚举)

为啥作用域枚举默认支持运算符'<'?

为啥不能在位和中使用作用域枚举?

python基础-内置函数-作用域-闭包-递归-python3

是否可以确定一个类型是否是作用域枚举类型?

是否可以确定一个类型是否是作用域枚举类型?