在以下声明中:
enum class en : signed char { A = 127, B };
gcc (和 clang )表示B
值超出了枚举的范围,即[-128,127]。写入时也会显示错误:
enum class en : signed char { A = 128 };
但是,在第二种情况下,初始值设定项必须是从类型int
到类型signed char
的转换常量表达式,这不允许缩小转换,因此该构造是不正确的。
但是第一种情况呢?没有初始化程序,因此规则不适用。
标准说:
[dcl.enum]§2没有初始值设定项的枚举数定义为枚举数提供值通过将前一个枚举器的值增加一个来获得。
因此,选择范围(signed char
)显然不足以保存值128
。
也许编译器决定将该案例视为规则违规(因此该程序格式错误),但我不认为这是违规行为,因为它不是某种违反规则的程序的属性,但是关于编译器应该做什么的命令。在这种情况下,我会说这是一个没有明确描述或禁止的角落案例。