切换枚举类的所有项时的默认大小写编译

时间:2013-03-18 09:23:34

标签: c++ c++11 enums

为什么以下开关甚至编译默认情况,因为它涵盖了枚举类的所有项目? 我原以为这就是首先拥有强大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!");
    }    
}

Proof

2 个答案:

答案 0 :(得分:4)

因为编译无法知道是否有人向枚举类型输入了非法值。考虑:

E c = static_cast<E>( 42 );

当您明确地告诉编译器“我知道我在做什么,不检查值”时,演员将编译时没有警告(甚至是错误)。实际上,这种情况比你想象的更容易发生。 :(

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

答案 1 :(得分:1)

枚举不限于您命名的值。它们仅限于适合底层类型的值,这是一个足以容纳所有值的整数类型。例如:

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