5
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 中失败。这些需要static_cast<pid>(propId)在 switch 子句中使用。

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

哪一个做对了?

4

1 回答 1

6

标准第 4 条,“标准转换”,只有 every 列出了无范围的枚举。因此,强枚举没有任何标准转换,您必须static_cast在任一方向使用。

您可能会争辩说,这种明确性是强枚举的全部意义所在。它们不会立即充当整数,而是需要明确的意图声明。请注意 [谢谢,@DyP]switch语句明确支持强枚举并且不需要手动转换为某些整数类型。

于 2014-01-01T16:11:28.797 回答