std::unreachable
来自cppreference.com
在标头 <utility> 定义
|
||
[[noreturn]] void unreachable(); |
(C++23 起) | |
引发未定义行为。实现可以用此宏优化掉不可能的代码分支(常在优化构建),或使之进入陷阱以免后续执行(常在调试构建)。
可能的实现
[[noreturn]] inline void unreachable() { // 若可能则使用编译器特定的扩展。 // 即使不使用扩展,空函数体与 noreturn 属性也足以引发未定义行为。 #ifdef __GNUC__ // GCC, Clang, ICC __builtin_unreachable(); #elifdef _MSC_VER // MSVC __assume(false); #endif } |
注解
功能特性测试宏 | 值 | 标准 | 备注 |
---|---|---|---|
__cpp_lib_unreachable |
202202L | (C++23) | std::unreachable
|
示例
运行此代码
#include <vector> #include <cassert> #include <cstddef> #include <cstdint> #include <utility> 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(表达式)]] (C++23)
|
指示 表达式 在给定的位置永远为 true (属性指示符) |
(C++20) |
告知编译器指针已对齐 (函数模板) |