noexcept (C++)

C++11: especifica si una función podría generar excepciones.

Sintaxis

noexcept-specifier:
noexcept
noexcept-expression
throw ( )
noexcept-expression:
noexcept ( constant-expression )

Parámetros

constant-expression
Expresión constante de tipo bool que representa si el conjunto de posibles tipos de excepciones está vacío. La versión incondicional es equivalente a noexcept(true).

Comentarios

Un elemento noexcept-expression es un tipo de especificación de excepción: un sufijo a una declaración de función que representa un conjunto de tipos que podría coincidir con un controlador de excepciones para cualquier excepción que salga de una función. El operador condicional unario noexcept(constant_expression) cuando constant_expression produce true, y su sinónimo incondicional noexcept, especifican que el conjunto de posibles tipos de excepciones que pueden salir de una función está vacío. Es decir, la función nunca inicia una excepción y nunca permite que una excepción se propague fuera de su ámbito. El operador noexcept(constant_expression) cuando constant_expression produce false o la ausencia de una especificación de excepción (que no sea para un destructor o una función de desasignación), indica que el conjunto de excepciones posibles que pueden salir de la función es el conjunto de todos los tipos.

Marque una función como noexcept solo si todas las funciones a las que llama, directa o indirectamente, también son noexcept o const. El compilador no comprueba necesariamente cada ruta de acceso al código en busca de excepciones que podrían ascender hasta una función noexcept. Si una excepción sale del ámbito exterior de una función marcada como noexcept, std::terminate se invoca inmediatamente y no hay ninguna garantía de que se vayan a invocar los destructores de ningún objeto del ámbito. Use noexcept en lugar del especificador dinámico de excepciones throw(). La especificación dinámica de excepciones, o especificación throw(optional_type_list), quedó en desuso en C++11 y se quitó en C++17, excepto para throw(), que es un alias de noexcept(true). Se recomienda aplicar noexcept a cualquier función que nunca permita que una excepción se propague a la pila de llamadas. Cuando se declara una función noexcept, permite que el compilador genere código más eficaz en varios contextos diferentes. Para más información, consulte Especificaciones de excepciones.

Ejemplo

Una plantilla de función que copia su argumento puede declararse noexcept en la condición de que el objeto que se va a copiar sea un tipo de datos antiguo (POD) sin formato. Este tipo de función podría declararse de este modo:

#include <type_traits>

template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
{
   // ...
}

Consulte también

Procedimientos recomendados de C++ moderno para las excepciones y el control de errores
Especificaciones de excepciones (throw, noexcept)