std:: unreachable
From cppreference.net
C++
Utilities library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Program support utilities
| Program termination | |||||||||||||||||||||
|
|||||||||||||||||||||
| Unreachable control flow | |||||||||||||||||||||
|
unreachable
(C++23)
|
|||||||||||||||||||||
| Communicating with the environment | |||||||||||||||||||||
| Signals | |||||||||||||||||||||
| Signal types | |||||||||||||||||||||
| Non-local jumps | |||||||||||||||||||||
| Types | |||||||||||||||||||||
|
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
Exécuter ce code
#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) |
|
(C++20)
|
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
|