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

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

enum class Foo:uint32_t{...};

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

【问题讨论】:

  • 这不是他们的重点吗?

标签: c++ c++11 type-safety


【解决方案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:当然,虽然在一定的抽象级别上是一样的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多