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 節「標準変換」では、スコープのない列挙のみがリストれます。したがって、強力な列挙型には標準の変換がなくstatic_castどちらの方向にも を使用する必要があります。

この種の明示性は、強力な列挙型の要点であると主張できます。それらはすぐに整数として機能するのではなく、明示的な意図の宣言を必要とします。[ありがとう、@DyP]switchステートメントは強力な列挙型を明示的にサポートし、整数型への手動変換を必要としないことに注意してください。

于 2014-01-01T16:11:28.797 に答える