std::unreachable
來自 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
|