【发布时间】:2014-05-08 18:02:00
【问题描述】:
为什么不能将作用域枚举隐式转换为 int?如果我有
enum class Foo:uint32_t{...};
然后我知道 Foo 所涵盖的整数是 uint32_t 所涵盖的整数的子集,所以我应该始终是安全的。我在这里错过了一些怪癖吗?但相反的情况并不安全。
【问题讨论】:
-
这不是他们的重点吗?
标签: c++ c++11 type-safety
为什么不能将作用域枚举隐式转换为 int?如果我有
enum class Foo:uint32_t{...};
然后我知道 Foo 所涵盖的整数是 uint32_t 所涵盖的整数的子集,所以我应该始终是安全的。我在这里错过了一些怪癖吗?但相反的情况并不安全。
【问题讨论】:
标签: c++ c++11 type-safety
正如 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!
【讨论】:
仅仅因为这样的转换总是可以成功并不意味着你希望它是隐式的。
作用域枚举的全部目的是它们是不同的类型,在重载决策期间不会导致混淆结果。
明确是好的。
【讨论】: