如果我有一个强类型的枚举,比如底层类型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);
}
答案 0 :(得分:16)
来自n3290,5.2.9静态演员[expr.static.cast]:
10可以显式转换积分或枚举类型的值 到枚举类型。如果原始值,该值不变 在枚举值(7.2)的范围内。否则, 结果值未指定(可能不在该范围内)。 [...]
枚举类型包括使用enum
声明的那些类型以及使用enum class
或enum struct
声明的类型,标准分别调用 unscoped 枚举和范围枚举。 7.2枚举声明[dcl.enum]中详细描述。
枚举类型的值不会与其枚举器混淆。在您的情况下,由于您声明的枚举都有int
作为其基础类型,因此其值范围与int
的值相同:从INT_MIN
到INT_MAX
(包括)。
由于42
的类型为int
且显然是int
的值,因此定义了行为。