- utility[meta header]
- function[meta id-type]
- std[meta namespace]
- cpp23[meta cpp]
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) 呼び出しは未定義動作を引き起こす。
}
- std::unreachable[color ff0000]
1
0
- C++23
- Clang: 15.0 [mark verified]
- GCC: 12.1 [mark verified]
- ICC: ??
- Visual C++: ??