将范围枚举转换为int

use*_*329 2 c++ type-safety c++11

为什么不能将带范围的枚举隐式转换为int?如果我有

enum class Foo:uint32_t{...};
Run Code Online (Sandbox Code Playgroud)

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

Lig*_*ica 6

仅仅因为这样的转换总能成功并不意味着你希望它是隐含的.

范围枚举的整个目的是它们是不同的类型,在重载解析期间不会导致混乱的结果.

明确是好的.


Pra*_*ian 5

正如LightnessRacesinOrbit在他的回答中解释的那样,范围枚举的整个目的是禁止隐式转换为基础类型.

您可以通过a显式转换它们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!
Run Code Online (Sandbox Code Playgroud)