为什么以下开关甚至编译默认情况,因为它涵盖了枚举类的所有项目?我本来会认为这是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)
因为编译无法知道是否有人将非法值转换为枚举类型。考虑:
E c = static_cast<E>( 42 );
Run Code Online (Sandbox Code Playgroud)
当您明确告诉编译器“我知道我在做什么,不要检查值”时,转换将在没有警告(甚至错误)的情况下进行编译。在实践中,这种情况发生的频率比你想象的要多。:(
此外,所有代码都必须有效,即使后来因无法访问而被删除。Astatic_assert(false,...)将在编译时触发,与运行时发生的情况无关。
| 归档时间: |
|
| 查看次数: |
1670 次 |
| 最近记录: |