Namespaces
Variants

std:: unreachable

From cppreference.net
Utilities library
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

#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