将底层类型的任意值强制转换为强类型的枚举类型是否安全?

问题描述:

如果我有一个强类型的枚举,与比如说,基础类型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 classenum struct那些类型,其标准分别调用无作用域枚举和作用域枚举。在7.2枚举声明[dcl.enum]中有更详细的描述。

枚举类型的不会与其枚举器混淆。在你的情况下,由于枚举你宣布都有int为它们的基础类型的值的范围是相同的int:从INT_MININT_MAX(含)。

由于42的类型为int,并且该行为显然是int的值。

+0

啊,我误解了“枚举值”的含义。谢谢。 – ecatmur