为什么允许使用任意值初始化枚举类临时值?

时间:2015-06-15 18:55:47

标签: c++ c++11

我在CppCon 2014演讲中遇到了一些类似下面的代码,这些代码混淆了我。观众接受了它没有评论,所以我认为它是合法的:

enum class Foo { Bar };

Foo const v1 = Foo(5);

问题是:为什么要编译?我希望编译失败并抱怨我们无法将int转换为Foo。下面略微修改的行失败,出现预期的错误:

Foo const v1(5);

1 个答案:

答案 0 :(得分:9)

如果未指定其他基础类型,则范围内的枚举类型具有隐式基础类型int。可以表示类型int的所有可能值。

7.2p5:

  

[...]对于作用域枚举类型,如果未明确指定,则基础类型为int。在这两种情况下,基础类型   据说是修复。 [...]

7.2p8:

  

对于其基础类型已修复的枚举,枚举的值是基础类型的值。 [...]

可以通过枚举表示的任何整数值都可以显式转换为该枚举类型,正如@Columbo在他现在删除的答案中指出的那样:

5.2.9p10:

  

可以将整数或枚举类型的值显式转换为枚举类型。如果原始值在枚举值(7.2)的范围内,则该值不变。 [...]

由于评论中存在一些混淆:

enum class Foo { Bar };

Foo const v1 = Foo(5);

定义明确。未定义,未指定,甚至未实现定义。我引用的标准部分解释了:

  1. Foo的基础类型为int,基础类型已修复。
  2. Foo的值是int
  3. 的值
  4. 由于5位于枚举值的范围内,因此转换时该值不会更改。