对于具有固定底层类型的枚举,因为c++ 17可以使用该类型的整数值直接初始化列表。
1. 对于普通枚举类型
制定底层类型的普通枚举可以通过{integer_value}直接初始化:
// unscoped enum with underlying type:
enum MyInt : char { };
MyInt i1{42}; // OK since C++17 (ERROR before C++17)
MyInt i2 = 42; // still ERROR
MyInt i3(42); // still ERROR
MyInt i4 = {42}; // still ERROR
MyInt i5{422} //error: narrowing conversion of ‘422’ from ‘int’ to ‘char’ [-Wnarrowing]
2.对于强枚举类型
// scoped enum with default underlying type:
enum class Salutation { mr, mrs };
Salutation s1{0}; // OK since C++17 (ERROR before C++17)
Salutation s2 = 0; // still ERROR
Salutation s3(0); // still ERROR
Salutation s4 = {0}; // still ERROR
Salutation s5{0xffffffffff};//error: narrowing conversion of ‘1099511627775’ from ‘long int’ to ‘int’ [-Wnarrowing]
Salutation s6{3}; //std::cout << static_cast<int>(s6);打印3
对于制定底层类型的Salutation,其初始化跟上面介绍的一样。
不管对于普通枚举还是强枚举,通过正确的语法来初始化,如果初始化的值大于枚举底层值的范围,编译会报错的。
对于没有指定底层类型的普通类型不能用整数初始化:
enum Flag { bit1=1, bit2=2, bit3=4 };
Flag f1{0}; // error: invalid conversion from ‘int’ to ‘Flag’ [-fpermissive]
还要注意,列表初始化仍然不允许类型截取,如:
enum MyInt : char { };
MyInt i5{42.2}; //error: narrowing conversion of ‘4.2200000000000003e+1’ from ‘double’ to ‘char’ [-Wnarrowing]
这个特性的目的是通过定义枚举类型映射到现有的整数类型来支持定义新整数类型的技巧,就像这里使用MyInt所做的那样。如果没有该特性,就无法在不强制转换的情况下初始化新对象。事实上,由于c++ 17标准库还提供了std::byte,它使用的就是这个特性。