考虑代码片段:
enum class Color : char { red = 0x1, yellow = 0x2 }; char *data = ReadFile(); Color color = static_cast<Color>(data[0]);
会发生什么当 data[0] 为 100 时?根据 C 11 和 C 14 标准,结果值未指定,这意味着它可以是任何值。
但是,在 CWG 1766 之后,将枚举范围之外的值转换为枚举类型现在可以调用未定义行为(UB)。此更改仅影响选择将缺陷应用到其 C 11 和 C 14 编译模式的编译器实现。
在 switch 中语句中,条件转换为整型。对于无作用域枚举,此转换适用于整数;对于作用域枚举(枚举类和枚举结构),不会发生提升。无论如何,条件值在基础类型和 int 的范围内,因此仍应命中默认标签。
For没有固定基础类型的枚举,将值转换到范围之外可能会导致未指定的行为(在 CWG 1766 之前)或 UB(在CWG 1766)。这可以用枚举 ColorUnfixed 来说明:
enum ColorUnfixed { red = 0x1, yellow = 0x2 };
由于基础类型不固定,ColorUnfixed 的范围是从 0 到 3,因此 100 是无效值。
以上是在 C 中将无效值转换为枚举类时会发生什么?的详细内容。更多信息请关注PHP中文网其他相关文章!