std::unreachable
Von de.cppreference.net
< cpp | Hilfsprogramme
| Definiert im Header <utility>
|
||
[[noreturn]] void unreachable();
|
(seit C++23) | |
Ruft undefiniertes Verhalten an einem bestimmten Punkt auf.
Eine Implementierung kann dies nutzen, um unmögliche Codepfade zu optimieren (typischerweise in optimierten Builds) oder um sie abzufangen und eine weitere Ausführung zu verhindern (typischerweise in Debug-Builds).
Hinweise
| Feature-Test Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_unreachable
|
202202L
|
(C++23) |
std::unreachable
|
Mögliche Implementierung
[[noreturn]] inline void unreachable() { // Verwendet compilerspezifische Erweiterungen falls möglich. // Selbst wenn keine Erweiterung verwendet wird, wird undefiniertes Verhalten durch // einen leeren Funktionskörper und das noreturn-Attribut ausgelöst. #if defined(_MSC_VER) && !defined(__clang__) // MSVC __assume(false); #else // GCC, Clang __builtin_unreachable(); #endif } |
Beispiel
Diesen Code ausführen
#include <cassert> #include <cstddef> #include <cstdint> #include <utility> #include <vector> struct Color { std::uint8_t r, g, b, a; }; // Gehe davon aus, dass nur ein eingeschränkter Satz von Texturfunktionen unterstützt wird. 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); // Führt zu undefiniertem Verhalten }
Mögliche Ausgabe:
Segmentation fault
Siehe auch
[[
assume
(
expression
)]]
(C++23)
|
gibt an, dass der
Ausdruck
an einem bestimmten Punkt immer zu
true
ausgewertet wird
(Attributspezifizierer) |
|
(C++20)
|
informiert den Compiler, dass ein Zeiger ausgerichtet ist
(Funktionstemplate) |
|
C-Dokumentation
für
unreachable
|
|
Externe Links
| 1. |
GCC-Dokumentation:
__builtin_unreachable
|
| 2. |
Clang-Dokumentation:
__builtin_unreachable
|
| 3. |
MSVC-Dokumentation:
__assume
|