在switch语句中从int到enum类的隐式转换

时间:2014-01-01 16:02:08

标签: c++ c++11 type-conversion enum-class

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;会在每个编译器中产生错误。

哪一个做对了?

1 个答案:

答案 0 :(得分:6)

标准条款4,“标准转换”,仅列出 unscoped 枚举。因此,强大的枚举有任何标准转换,您必须在任一方向使用static_cast

你可以说,这种明确性是强烈的枚举的全部要点。它们不是一蹴而就的整数,而是需要明确的意图声明。请注意[感谢@DyP] switch语句明确支持强枚举,而需要手动转换为某种整数类型。