将底层类型的任意值强制转换为强类型的枚举类型是否安全?
问题描述:
如果我有一个强类型的枚举,与比如说,基础类型int
,是确定投的int
值不枚举任何匹配枚举类型?将底层类型的任意值强制转换为强类型的枚举类型是否安全?
enum e1 : int { x = 0, y = 1 };
enum class e2 : int { x = 0, y = 1 };
int main() {
e1 foo = static_cast<e1>(42); // is this UB?
e2 bar = static_cast<e2>(42);
}
答
从n3290,5.2.9静态施放[expr.static.cast]:
10整型或枚举类型的值可以显式转换 到枚举类型。如果原始值 在枚举值(7.2)的范围内,则值不变。否则, 结果值未指定(可能不在该范围内)。 [...]
枚举类型既包括被声明用enum
和那些声明为enum class
或enum struct
那些类型,其标准分别调用无作用域枚举和作用域枚举。在7.2枚举声明[dcl.enum]中有更详细的描述。
枚举类型的值不会与其枚举器混淆。在你的情况下,由于枚举你宣布都有int
为它们的基础类型的值的范围是相同的int
:从INT_MIN
到INT_MAX
(含)。
由于42
的类型为int
,并且该行为显然是int
的值。
啊,我误解了“枚举值”的含义。谢谢。 – ecatmur