Difference between revisions of "cpp/utility/unreachable"
From cppreference.com
m (Change navbar) |
m (Now it's suitable to + dsc see c.) |
||
Line 62: | Line 62: | ||
Segmentation fault | Segmentation fault | ||
}} | }} | ||
+ | |||
+ | ===See also=== | ||
+ | {{dsc begin}} | ||
+ | {{dsc see c | c/program/unreachable}} | ||
+ | {{dsc end}} | ||
===External Links=== | ===External Links=== |
Revision as of 19:22, 3 July 2022
Defined in header <utility>
|
||
[[noreturn]] void unreachable(); |
(since C++23) | |
Invokes undefined behavior. An implementation may use this to optimize impossible code branches away (typically, in optimized builds) or to trap them to prevent further execution (typically, in debug builds).
Contents |
Notes
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_unreachable |
Possible implementation
[[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. #ifdef __GNUC__ // GCC, Clang, ICC __builtin_unreachable(); #elifdef _MSC_VER // MSVC __assume(false); #endif } |
Example
Run this code
#include <vector> #include <cassert> #include <cstddef> #include <cstdint> #include <utility> 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 }
Possible output:
Segmentation fault
See also
C documentation for unreachable
|