Namespaces
Variants

std::unreachable

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support linguistique
Support de types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (obsolète en C++20)
 
 
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 l'élimination de branches de code impossibles (typiquement, dans les builds optimisées) ou pour les intercepter afin d'empêcher toute exécution ultérieure (typiquement, dans les builds de débogage).

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