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 | |||||||||||||||||||||
|
Definiert in Header
<utility>
|
||
|
[
[
noreturn
]
]
void
unreachable
(
)
;
|
(seit C++23) | |
Ruft an einem gegebenen Punkt undefined behavior auf.
Eine Implementierung kann dies verwenden, um unmögliche Codezweige zu entfernen (typischerweise in optimierten Builds) oder um sie abzufangen, um eine weitere Ausführung zu verhindern (typischerweise in Debug-Builds).
Inhaltsverzeichnis |
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
|