Namespaces
Variants

std::unreachable

Von de.cppreference.net
 
 
Hilfsprogramm-Bibliothek
Sprachunterstützung
Typunterstützung (grundlegende Typen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Hilfsprogramme
Funktionen mit variabler Argumentanzahl
Koroutinenunterstützung (C++20)
Vertragsunterstützung (C++26)
Dreiseitiger Vergleich
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Allgemeine Hilfsprogramme
Relationale Operatoren (veraltet in C++20)
Ganzzahl-Vergleichsfunktionen
(C++20)(C++20)(C++20)    
(C++20)
Swap- und Typoperationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Allgemeine Vokabular-Typen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
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

#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)
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