我在CppCon 2014演讲中遇到了一些类似下面的代码,这些代码混淆了我。观众接受了它没有评论,所以我认为它是合法的:
enum class Foo { Bar };
Foo const v1 = Foo(5);
问题是:为什么要编译?我希望编译失败并抱怨我们无法将int转换为Foo。下面略微修改的行失败,出现预期的错误:
Foo const v1(5);
答案 0 :(得分:9)
如果未指定其他基础类型,则范围内的枚举类型具有隐式基础类型int
。可以表示类型int
的所有可能值。
7.2p5:
[...]对于作用域枚举类型,如果未明确指定,则基础类型为
int
。在这两种情况下,基础类型 据说是修复。 [...]
7.2p8:
对于其基础类型已修复的枚举,枚举的值是基础类型的值。 [...]
可以通过枚举表示的任何整数值都可以显式转换为该枚举类型,正如@Columbo在他现在删除的答案中指出的那样:
5.2.9p10:
可以将整数或枚举类型的值显式转换为枚举类型。如果原始值在枚举值(7.2)的范围内,则该值不变。 [...]
由于评论中存在一些混淆:
enum class Foo { Bar }; Foo const v1 = Foo(5);
定义明确。未定义,未指定,甚至未实现定义。我引用的标准部分解释了:
Foo
的基础类型为int
,基础类型已修复。Foo
的值是int
。5
位于枚举值的范围内,因此转换时该值不会更改。