如果我尝试编译下面的代码,它会给我一个错误,即'枚举值对于底层类型'char'来说太大了
enum class Status:char{one=126,two=127,three=128};
Status s = Status::three;
但是,如果我执行以下代码编译器,请不要给我任何错误,并默默地忽略char超出范围
char x = 128;
因此,在枚举基础类型的情况下,编译器不检查正常数据类型并检查范围是否有任何特定原因。
答案 0 :(得分:2)
C ++ 11引入了对“缩小转换次数”的限制以及它们所在和不允许的位置。隐藏在5.19§3中的是一个描述“转换常量表达式”的子句,特别是排除了缩小转换的条款,然后注意到这些表达式可以用在[...]枚举器初始化器中。因此,你做不到:
enum class Foo : char { one = 128 };
unsigned char uc1 = {-1};
但你可以做到
enum class Foo : char { one = (char)128 };
unsigned char uc1 = -1;
5.19 [expr.const]§3
[...] T类型的转换常量表达式是一个表达式,隐式转换为类型T的prvalue,其中转换后的表达式是核心常量表达式,隐式转换序列仅包含用户定义的转换,左值-torvalue conversions(4.1),整数促销(4.5)和积分转换(4.7),而不是缩小转化次数(8.5.4)。 [注意:这样的表达式可以在新表达式(5.3.4)中使用,作为case表达式(6.4.2),如果底层类型是固定的(7.2),则作为枚举器初始化器,作为数组边界(8.3.4),以及整数或枚举非类型模板参数(14.3)。 - 后注]