std:: unreachable
From cppreference.net
C++
Utilities library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Program support utilities
| Program termination | |||||||||||||||||||||
|
|||||||||||||||||||||
| Unreachable control flow | |||||||||||||||||||||
|
unreachable
(C++23)
|
|||||||||||||||||||||
| Communicating with the environment | |||||||||||||||||||||
| Signals | |||||||||||||||||||||
| Signal types | |||||||||||||||||||||
| Non-local jumps | |||||||||||||||||||||
| Types | |||||||||||||||||||||
|
定义于头文件
<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); // 正常 assert(tex.size() == 128 * 128); generate_texture(tex, 32); // 导致未定义行为 }
可能的输出:
Segmentation fault
参阅
[[
assume
(
expression
)]]
(C++23)
|
指定在给定点表达式将始终求值为
true
(属性说明符) |
|
(C++20)
|
告知编译器指针已对齐
(函数模板) |
|
C 文档
关于
unreachable
|
|
外部链接
| 1. |
GCC 文档:
__builtin_unreachable
|
| 2. |
Clang 文档:
__builtin_unreachable
|
| 3. |
MSVC 文档:
__assume
|