Namespaces
Variants

std:: unreachable

From cppreference.net
Utilities library
Défini dans l'en-tête <utility>
[ [ noreturn ] ] void unreachable ( ) ;
(depuis C++23)

Invoque un comportement indéfini à un point donné.

Une implémentation peut utiliser cela pour optimiser en éliminant les branches de code impossibles (généralement, dans les versions optimisées) ou pour les piéger afin d'empêcher toute exécution ultérieure (généralement, dans les versions de débogage).

Table des matières

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_unreachable 202202L (C++23) std::unreachable

Implémentation possible

[[noreturn]] inline void unreachable()
{
    // Utilise des extensions spécifiques au compilateur si possible.
    // Même si aucune extension n'est utilisée, un comportement indéfini est toujours déclenché par
    // un corps de fonction vide et l'attribut noreturn.
#if defined(_MSC_VER) && !defined(__clang__) // MSVC
    __assume(false);
#else // GCC, Clang
    __builtin_unreachable();
#endif
}

Exemple

#include <cassert>
#include <cstddef>
#include <cstdint>
#include <utility>
#include <vector>
struct Color { std::uint8_t r, g, b, a; };
// Supposons que seul un ensemble restreint de capacités de texture est pris en charge.
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);  // Résulte en un comportement indéfini
}

Sortie possible :

Segmentation fault

Voir aussi

[[ assume ( expression )]]
(C++23)
spécifie que l' expression sera toujours évaluée à true à un point donné
(spécificateur d'attribut)
informe le compilateur qu'un pointeur est aligné
(modèle de fonction)
Documentation C pour unreachable

Liens Externes

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