std::unreachable
来自cppreference.com
<tbody>
</tbody>
| 在标头 <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(表达式)]](C++23) |
指示表达式 在给定的位置永远为 true(属性指示符) |
(C++20) |
告知编译器指针已对齐 (函数模板) |
unreachable 的 C 文档
| |
外部链接
| 1. | GCC 文档:__builtin_unreachable
|
| 2. | Clang 文档:__builtin_unreachable
|
| 3. | MSVC 文档:__assume
|