考虑代码:
Double
根据枚举限制规则,上限为2 ^ 4-1 = 15,下限为0(参考:C ++ Primer Plus书)。
但enum spect{violet,indigo,blue,green=8};
spect band = spect (94);
所以它应该发出警告或错误。但我的程序运行正常。为什么呢?
答案 0 :(得分:0)
我认为那本书要么错了,要么你误解了它对枚举的基本类型的看法。 C ++ 11规范说:
§7.2
6对于其基础类型未修复的枚举,基础类型是可以的整数类型 表示枚举中定义的所有枚举器值。如果没有整数类型可以代表所有 枚举值,枚举是不正确的。它是实现定义的,使用整数类型 作为基础类型,除了基础类型不应大于
int
,除非a的值 枚举器无法容纳int
或unsigned 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的单个枚举器。