std::unreachable
From cppreference.com
| ヘッダ <utility> で定義 |
||
| [[noreturn]] void unreachable(); |
(C++23から) | |
指定された点で未定義動作を呼び出します。
実装は、これを使用して到達不可能なコード分岐を最適化により除去したり(通常は最適化されたビルドで)、さらに実行されないようにトラップしたり(通常はデバッグビルドで)できます。
目次 |
[編集] 注釈
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_unreachable |
202202L |
(C++23) | std::unreachable
|
[編集] 可能な実装
[[noreturn]] inline void unreachable() { // Uses compiler specific extensions if possible. // Even if no extension is used, undefined behavior is still raised by // an empty function body and the noreturn attribute. #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; }; // Assume that only restricted set of texture caps is supported. 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); // Results in undefined behavior }
実行結果の例
Segmentation fault
[編集] 関連項目
[[assume(expression)]](C++23) |
特定の時点でexpressionが常にtrueに評価されることを指定します (属性指定子) |
| (C++20) |
ポインタがアラインされていることをコンパイラに伝えます (関数テンプレート) |
| Cドキュメント (unreachable)
| |
[編集] 外部リンク
| 1. | GCCドキュメント: __builtin_unreachable
|
| 2. | Clangドキュメント: __builtin_unreachable
|
| 3. | MSVCドキュメント: __assume
|