issue 2026_10_19:C++23 std::unreachable() 在 switch-case 中的优化和埋雷
此博客不具有时效性,最后更新时间: 2026_10_19 。
如题。
考虑一个 switch-case 场景
switch(state) {
case A:
case B:
case C:
}
优化
当我们确定 A, B, C, 可以覆盖所有可能时,我们可以在 default 的位置进行异常处理,如下
switch(state) {
case A: // ...
case B: // ...
case C: // ...
defaule: // 异常处理。
}
std::unreachable(); 对编译器保证某处不可达,编译器可以反过来利用这一特性在状态转移系统上剪枝。
我们可以选择更激进的做法,在 default 位置进行 std::unreachable() ,如下
switch(state) {
case A: // ...
case B: // ...
case C: // ...
defaule: std::unreachable();
}
// 或者
switch(state) {
case A: // ...
case B: // ...
case C: // ...
}
std::unreachable();
埋雷
特性1:考虑 case 的对象是一个枚举类实体,编译器会要求我们 case 覆盖所有实体,否则会甩出警告。
我们在此处依然可以使用 std::unreachable(); 帮助编译器优化,同时关闭警告。
同时,我们可以 ban 掉某个 case 。这可以让编译器不发出警告,但是表现出非预期的行为。
——永远是挑战而不是练习,下次一定更好。
浙公网安备 33010602011771号