将作用域枚举转换为 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的主要内容,如果未能解决你的问题,请参考以下文章