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 回答