为什么初始化枚举变量超出范围不会给我一个警告或错误?

时间:2016-06-04 15:31:02

标签: c++ enumeration

考虑代码:

Double

根据枚举限制规则,上限为2 ^ 4-1 = 15,下限为0(参考:C ++ Primer Plus书)。

enum spect{violet,indigo,blue,green=8}; spect band = spect (94); 所以它应该发出警告或错误。但我的程序运行正常。为什么呢?

1 个答案:

答案 0 :(得分:0)

我认为那本书要么错了,要么你误解了它对枚举的基本类型的看法。 C ++ 11规范说:

§7.2

  

6对于其基础类型未修复的枚举,基础类型是可以的整数类型   表示枚举中定义的所有枚举器值。如果没有整数类型可以代表所有   枚举值,枚举是不正确的。它是实现定义的,使用整数类型   作为基础类型,除了基础类型不应大于int,除非a的值   枚举器无法容纳intunsigned int。如果枚举器列表为空,则基础类型为   好像枚举有一个值为0的枚举器。

此外:

§5.2.9

  

10可以将整数或枚举类型的值显式转换为枚举类型。价值是   如果原始值在枚举值(7.2)的范围内,则不变。否则,结果   值未指定(可能不在该范围内)。也可以转换浮点类型的值   到枚举类型。结果值与将原始值转换为基础值相同   枚举的类型(4.9),然后是枚举类型。

我认为这本书可能试图解释以下条款:

§7.2

  

7对于其基础类型是固定的枚举,枚举的值是。的值   基础类型。否则,对于枚举,其中 e min 是最小的枚举数, e max 是   最大值,枚举值是 b min b max 范围内的值,定义如下:让 K   对于二进制补码表示为1,对于一个补码或符号幅度表示为0。    b max 是大于或等于 max 的最小值(| e min | - K ,| e max |)等于2 M < / em> - 1,其中    M 是一个非负整数。如果 e min 非负且< - > K )否则。的大小   如果 bmin max M ,1),那么大到足以容纳枚举类型的所有值的最小位字段是   否则为零和 M + 1。可以定义具有未由其任何值定义的值的枚举   统计员。如果枚举器列表为空,则枚举的值就像枚举有一个   值为0的单个枚举器。