Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有固定枚举而不是溢出的格式错误的程序_C++_Enums_Range_C++14 - Fatal编程技术网

C++ 具有固定枚举而不是溢出的格式错误的程序

C++ 具有固定枚举而不是溢出的格式错误的程序,c++,enums,range,c++14,C++,Enums,Range,C++14,在以下声明中: enum class en : signed char { A = 127, B }; gcc(和clang)表示B值超出了枚举的范围,即[-128127]。写入时也会显示错误: enum class en : signed char { A = 128 }; 但是,在第二种情况下,初始值设定项必须是从类型int转换为类型signed char的常量表达式,这不允许缩小转换,因此该构造形式不正确 但是第一个案例呢?没有初始值设定项,因此该规则不适用 标准上说: [dcl.en

在以下声明中:

enum class en : signed char { A = 127, B };
gcc(和clang)表示
B
值超出了枚举的范围,即[-128127]。写入时也会显示错误:

enum class en : signed char { A = 128 };
但是,在第二种情况下,初始值设定项必须是从类型
int
转换为类型
signed char
的常量表达式,这不允许缩小转换,因此该构造形式不正确

但是第一个案例呢?没有初始值设定项,因此该规则不适用

标准上说:

[dcl.enum]§2没有初始值设定项的枚举器定义为枚举器提供通过将前一个枚举器的值增加1而获得的值

因此,很明显,choosen范围(
signed char
)不够大,无法保存值
128


也许编译器决定将这种情况视为违反规则(因此程序的格式不正确),但我不认为这是违反规则,因为违反规则的不是程序的某种属性,而是关于编译器应该做什么的命令。在这种情况下,我会说这是一个没有明确描述或禁止的角落案例。

没有明确或隐含定义的行为的角落案例是定义为未定义的行为。进一步阅读[dcl.enum]§5:“如果基础类型是固定的,则右括号之前的每个枚举数的类型为基础类型,枚举数定义中的常量表达式应为基础类型的转换常量表达式。”作为转换(从128到
带符号字符
)来源:我相信你引用的前一句话,如果第一个枚举数没有初始值设定项,相应常量的值为零。这意味着
B
被隐式转换为
B=128
@richardcriten
B
(在第一种情况下,而不是第二种情况下),是否没有
常量表达式
@NathanOliver?