切换枚举类的所有项目时的默认情况编译

Gur*_*pof 5 c++ enums c++11

为什么以下开关甚至编译默认情况,因为它涵盖了枚举类的所有项目?我本来会认为这是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!");
    }    
}
Run Code Online (Sandbox Code Playgroud)

证明

Dan*_*rey 5

因为编译无法知道是否有人将非法值转换为枚举类型。考虑:

E c = static_cast<E>( 42 );
Run Code Online (Sandbox Code Playgroud)

当您明确告诉编译器“我知道我在做什么,不要检查值”时,转换将在没有警告(甚至错误)的情况下进行编译。在实践中,这种情况发生的频率比你想象的要多。:(

此外,所有代码都必须有效,即使后来因无法访问而被删除。Astatic_assert(false,...)将在编译时触发,与运行时发生的情况无关。