Espacios de nombres
Variantes

std::unreachable

De cppreference.com
 
 
Biblioteca de servicios
Apoyo del lenguaje
Apoyo de tipos (tipos básicos, RTTI)
Macros de prueba de característica de la biblioteca (C++20)
Servicios de programa
Funciones variádicas
Apoyo de corrutinas (C++20)
Apoyo de contratos (C++26)
Comparación de tres vías (C++20)
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

 
 
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

#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)[editar]
Informa al compilador que un puntero está alineado.
(plantilla de función) [editar]
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