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

R. *_*des 14 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);
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ton 16

来自n3290,5.2.9 Static cast [expr.static.cast]:

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

枚举类型包括声明的那些类型enum和用enum class或声明的类型,enum struct标准分别调用未编组的枚举和范围枚举.在7.2枚举声明[dcl.enum]中有更详细的描述.

枚举类型的不会与其枚举器混淆.在你的情况下,由于枚举你声明都有int其基础类型的值的范围是一样的,即int:从INT_MININT_MAX(含).

由于42具有类型int并且显然int是定义了行为的值.