std::unreachable
ja.cppreference.net より
| ヘッダ <utility>
|
||
[[noreturn]] void unreachable();
|
(C++23 以降) | |
指定された箇所で未定義動作を呼び出します。
処理系はこれを用いて、到達不能なコード分岐を最適化で除去したり(通常は最適化ビルド)、さらなる実行を防ぐためにトラップしたり(通常はデバッグビルド)することができます。
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_unreachable
|
202202L
|
(C++23) |
std::unreachable
|
実装例
[[noreturn]] inline void unreachable() { // 可能であればコンパイラ固有の拡張機能を使用 // 拡張機能が使用されない場合でも、空の関数本体とnoreturn属性により未定義動作が発生する #if defined(_MSC_VER) && !defined(__clang__) // MSVC __assume(false); #else // GCC, Clang __builtin_unreachable(); #endif } |
例
このコードを実行
#include <cassert> #include <cstddef> #include <cstdint> #include <utility> #include <vector> struct Color { std::uint8_t r, g, b, a; }; // 制限されたテクスチャ機能のみがサポートされていると仮定 void generate_texture(std::vector<Color>& tex, std::size_t xy) { switch (xy) { case 128: [[fallthrough]]; case 256: [[fallthrough]]; case 512: /* ... */ tex.clear(); tex.resize(xy * xy, Color{0, 0, 0, 0}); break; default: std::unreachable(); } } int main() { std::vector<Color> tex; generate_texture(tex, 128); // OK assert(tex.size() == 128 * 128); generate_texture(tex, 32); // 未定義動作を引き起こす }
出力例:
Segmentation fault
関連項目
[[
assume
(
expression
)]]
(C++23)
|
指定された時点で
expression
が常に
true
と評価されることを指定する
(属性指定子) |
|
(C++20)
|
ポインタがアラインされていることをコンパイラに通知する
(関数テンプレート) |
|
Cドキュメント
for
unreachable
|
|
外部リンク
| 1. |
GCC ドキュメント:
__builtin_unreachable
|
| 2. |
Clang ドキュメント:
__builtin_unreachable
|
| 3. |
MSVC ドキュメント:
__assume
|