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