目录

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 。这可以让编译器不发出警告,但是表现出非预期的行为。

posted @ 2026-10-19 15:49  03Goose  阅读(4)  评论(0)    收藏  举报