switch 语句中从 int 到枚举类的隐式转换

Implicit conversion from int to enum class in switch statement

本文关键字:转换 枚举 语句 int switch      更新时间:2023-10-16
enum class pid
{
    Alpha, Beta, Gamma
};
int main()
{
    int propId = 2;
    switch(propId)
    {
    case pid::Alpha:
    case pid::Beta:
    case pid::Gamma:
        break;
    }
}

上面的代码片段在 msvc2012 中编译良好(并且有效),但在 clang-3.4 和 g++-4.8 中失败。这些需要在 switch 子句中使用static_cast<pid>(propId)

顺便说一下,没有显式强制转换的简单赋值(如 pid a = propId;)会在每个编译器中产生错误。

哪一个做对了?

标准条款 4"标准转换"仅列出每个未作用域的枚举。因此,强枚举没有任何标准转换,您必须在任一方向上使用static_cast

你可以争辩说,这种显式性是强枚举的全部意义所在。它们不会在帽子掉落时充当整数,而是需要明确的意图声明。注意[谢谢,@DyP]switch语句明确支持强枚举,不需要手动转换为某种整数类型。