5

次のスイッチは、列挙型クラスのすべての項目をカバーしているのに、デフォルトのケースをコンパイルするのはなぜですか?そもそもこれが強い理由だと思いenum classました。

すべてのケースをカバーしていることを知っているのに、なぜデフォルトにしたいのかについて:これは私の将来の不注意(および他の同僚の不注意)から私を守ります

enum class E {
    a,
    b
};

int main()
{
    E c = E::b;
    switch (c) {
        case E::a:
        case E::b:
            std::cout << "pass" << std::endl;
            break;
        default:
            static_assert(false, "This explodes!");
    }    
}

証拠

4

2 に答える 2

4

コンパイルは、誰かが列挙型に不正な値をキャストしたかどうかを知ることができないためです。検討:

E c = static_cast<E>( 42 );

コンパイラに「自分が何をしているのかわかっているので、値をチェックしないでください」と明示的に指示しているため、キャストは警告(またはエラー)なしでコンパイルされます。実際には、これは悲しいことにあなたが思っているよりも頻繁に起こります。:(

また、後で到達不能として削除された場合でも、すべてのコードが有効である必要があります。Astatic_assert(false,...)は、実行時に何が起こるかに関係なく、コンパイル時に起動します。

于 2013-03-18T09:29:15.633 に答える
0

列挙型は、指定した値に制限されません。これらは、すべての値を保持するのに十分な大きさの整数型である、基になる型に適合する値に制限されます。例えば:

enum flags {
    first = 0x01,
    second = 0x02,
    third = 0x04,
    fourth = 0x08
};

flags operator | (flags f0, flags f1) {
    return flags((int)f0 | (int)f1);
}

flags f = first | second; // okay; f holds 0x03
于 2013-03-18T12:37:39.063 に答える