Namespaces
Variants

C++ attribute: noreturn (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Indica que la función no retorna.

Contenidos

Sintaxis

[ [ noreturn ] ]

Explicación

Indica que la función no devolverá el flujo de control a la función llamadora después de finalizar (por ejemplo, funciones que terminan la aplicación, lanzan excepciones, se ejecutan en bucle indefinidamente, etc.). Este atributo se aplica únicamente al nombre de la función que se declara en las declaraciones de funciones.

Si una función previamente declarada con [ [ noreturn ] ] es invocada y esa invocación eventualmente retorna, el comportamiento es indefinido en tiempo de ejecución .

La primera declaración de la función debe especificar este atributo si alguna declaración lo especifica. Si una función se declara con [ [ noreturn ] ] en una unidad de traducción, y la misma función se declara sin [ [ noreturn ] ] en otra unidad de traducción, el programa está mal formado; no se requiere diagnóstico.

Ejemplo

[[noreturn]] void f()
{
    throw "error";
    // OK
}
void q [[noreturn]] (int i)
{
    // el comportamiento es indefinido si se llama con un argumento <= 0
    if (i > 0)
        throw "positive";
}
// void h() [[noreturn]]; // error: atributo aplicado al tipo de función de h, no a h misma
int main()
{
    try { f(); } catch(...) {}
    try { q(42); } catch(...) {}
}

Biblioteca estándar

Las siguientes funciones estándar se declaran con el atributo noreturn :

Funciones de terminación
(C++11)
provoca la terminación normal del programa sin limpieza
(función)
provoca la terminación anormal del programa (sin limpieza)
(función)
provoca la terminación normal del programa con limpieza
(función)
(C++11)
provoca la terminación rápida del programa sin limpieza completa
(función)
función llamada cuando falla el manejo de excepciones
(función)
(obsoleto en C++11) (eliminado en C++17)
función llamada cuando se viola una especificación de excepción dinámica
(función)
Sugerencias del compilador
marca un punto de ejecución inalcanzable
(función)
Funciones que siempre lanzan excepciones
lanza la excepción desde un std::exception_ptr
(función)
lanza la excepción almacenada
(función miembro pública de std::nested_exception )
lanza su argumento con std::nested_exception mezclado
(plantilla de función)
Saltos no locales (desde C++17)
salta a una ubicación especificada
(función)

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
CWG 2924 C++11 retornar desde una función [ [ noreturn ] ]
resultaría en comportamiento indefinido
resulta en comportamiento
indefinido en tiempo de ejecución

Referencias

  • Estándar C++23 (ISO/IEC 14882:2024):
  • 9.12.10 Atributo Noreturn [dcl.attr.noreturn]
  • Estándar C++20 (ISO/IEC 14882:2020):
  • 9.12.9 Atributo Noreturn [dcl.attr.noreturn]
  • Estándar C++17 (ISO/IEC 14882:2017):
  • 10.6.8 Atributo Noreturn [dcl.attr.noreturn]
  • Estándar C++14 (ISO/IEC 14882:2014):
  • 7.6.3 Atributo Noreturn [dcl.attr.noreturn]
  • Estándar C++11 (ISO/IEC 14882:2011):
  • 7.6.3 Atributo Noreturn [dcl.attr.noreturn]

Véase también

Documentación de C para _Noreturn
Documentación de C para [[noreturn]]