std::unreachable
De cppreference.com
| Definido en el archivo de encabezado <utility>
|
||
[[noreturn]] void unreachable();
|
(desde C++23) | |
Invoca comportamiento no definido en un punto determinado.
Una implementación puede utilizar esto para optimizar las ramificaciones de código imposibles (normalmente, en compilaciones optimizadas) o para atraparlas y evitar su ejecución posterior (normalmente, en compilaciones de depuración).
Notas
| Macro de Prueba de característica | Valor | Estándar | Comentario |
|---|---|---|---|
__cpp_lib_unreachable |
202202L |
(C++23) | std::unreachable
|
Posible implementación
[[noreturn]] inline void unreachable()
{
// Utiliza extensiones específicas del compilador si es posible.
// Incluso si no se utiliza ninguna extensión, el comportamiento indefinido
// se sigue generando por un cuerpo de función vacío y el atributo noreturn.
#if defined(_MSC_VER) && !defined(__clang__) // MSVC
__assume(false);
#else // GCC, Clang
__builtin_unreachable();
#endif
}
|
Ejemplo
Ejecuta este código
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <utility>
#include <vector>
struct Color { std::uint8_t r, g, b, a; };
// Supongamos que solo se admite un conjunto restringido de límites de textura.
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); // Resulta en comportamiento no definido
}
Posible salida:
Violación de acceso
Véase también
[[assume]](C++23)
|
Especifica que la expresión siempre se evaluará a true en un punto dado.(especificador de atributo) |
(C++20) |
Informa al compilador que un puntero está alineado. (plantilla de función) |
Documentación de C para unreachable
| |
Enlaces externos
| 1. | Documentación de GCC: __builtin_unreachable
|
| 2. | Documentación de Clang: __builtin_unreachable
|
| 3. | Documentación de MSVC: __assume
|