最終更新日時: 2024年09月03日 15時17分49秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<utility>

# std::unreachable(C++23)

    namespace std {
      [[noreturn]] void unreachable();
    }

## 概要

コード実行が本関数に到達しないことを表明する。

## 事前条件

`false`==`true`

## 備考

`std::unreachable`関数の事前条件は決して満たされない（恒偽式）ため、関数呼び出しは常に未定義の動作を引き起こす。 C++コンパイラはこの情報を利用し、`std::unreachable`呼び出しを含まないコードパスのみが実行されうると仮定して、より高速に動作するプログラムを生成する可能性がある。

## 例

    #include <iostream>
    #include <utility>

    int flip(int x)
    {
      switch (x) {
      case 0:
        return 1;
      case 1:
        return 0;
      default:
        // C++コンパイラは引数 x が値0,1以外を取らないと
        // 仮定したコード生成を行う可能性がある。
        std::unreachable();
      }
    }

    int main()
    {
      std::cout << flip(0) << std::endl;
      std::cout << flip(1) << std::endl;
      // 例えば f(2) 呼び出しは未定義動作を引き起こす。
    }

### 出力

    1
    0

## バージョン

### 言語

- C++23

### 処理系

- Clang: 15.0 ✅
- GCC: 12.1 ✅
- ICC: ??
- Visual C++: ??

## 関連項目

- C++20 `[[likely]]`, `[[unlikely]]`属性
- C++23 `[[assume]]`属性

## 参照

- GCC Built-in Function: `__builtin_unreachable`
- Clang Builtin Function: `__builtin_unreachable`
- MSVC Compiler intrinsics: `__assume`
- P0627R6 Function to mark unreachable code