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