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

时间:2011-08-07 17:02:46

标签: c++ enums c++11

如果我有一个强类型的枚举,比如底层类型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);
}

1 个答案:

答案 0 :(得分:16)

来自n3290,5.2.9静态演员[expr.static.cast]:

  

10可以显式转换积分或枚举类型的值   到枚举类型。如果原始值,该值不变   在枚举值(7.2)的范围内。否则,   结果值未指定(可能不在该范围内)。 [...]

枚举类型包括使用enum声明的那些类型以及使用enum classenum struct声明的类型,标准分别调用 unscoped 枚举和范围枚举。 7.2枚举声明[dcl.enum]中详细描述。

枚举类型的不会与其枚举器混淆。在您的情况下,由于您声明的枚举都有int作为其基础类型,因此其值范围与int的值相同:从INT_MININT_MAX(包括)。

由于42的类型为int且显然是int的值,因此定义了行为。

相关问题