Namensräume
Varianten
Aktionen

std::unreachable

Von cppreference.com
< cpp‎ | utility
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
Definiert in der Header-Datei <utility>
[[noreturn]] void unreachable();
(seit C++23)

Ruft an einer gegebenen Stelle undefiniertes Verhalten hervor.

Eine Implementierung kann dies nutzen, um unmögliche Codezweige wegzuparieren (typischerweise in optimierten Builds) oder um sie abzufangen und weitere Ausführung zu verhindern (typischerweise in Debug-Builds).

Inhalt

[bearbeiten] Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_lib_unreachable 202202L (C++23) std::unreachable

[bearbeiten] Mögliche Implementierung

[[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.
#if defined(_MSC_VER) && !defined(__clang__) // MSVC
    __assume(false);
#else // GCC, Clang
    __builtin_unreachable();
#endif
}

[bearbeiten] Beispiel

#include <cassert>
#include <cstddef>
#include <cstdint>
#include <utility>
#include <vector>
 
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
}

Mögliche Ausgabe

Segmentation fault

[bearbeiten] Siehe auch

[[assume(ausdruck)]]
(C++23)
spezifiziert, dass der ausdruck an einer gegebenen Stelle immer zu true ausgewertet wird
(Attribut-Spezifizierer)[bearbeiten]
informiert den Compiler, dass ein Zeiger ausgerichtet ist
(Funktions-Template) [edit]
C-Dokumentation für unreachable

[bearbeiten] Externe Links

1.  GCC Docs: __builtin_unreachable
2.  Clang Docs: __builtin_unreachable
3.  MSVC Docs: __assume