Operador noexcept (desde C++11) - cppreference.com
De cppreference.com
El operador noexcept realiza una comprobación en tiempo de compilación que devuelve true si una expresión se declara que no lanza ninguna excepción.
Se puede usar dentro del especificador noexcept de una plantilla de función para declarar que la función lanza excepciones para algunos tipos pero no para otros.
Sintaxis
noexcept( expresión )
|
|||||||||
Devuelve un prvalue de tipo bool.
Explicación
El operador noexcept no evalúa la expresión.
El resultado es true si el conjunto de posibles excepciones de la expresión está vacío (hasta C++17)la expresión es no lanzadora (desde C++17), y false en caso contrario.
Palabras clave
Ejemplo
#include <iostream> #include <utility> #include <vector> void puede_lanzar(); void no_lanza() noexcept; auto lpuede_lanzar = []{}; auto lno_lanza = []() noexcept {}; class T { public: ~T(){} // destructor previene constructor de movimiento // constructor de copia es noexcept }; class U { public: ~U(){} // destructor previene constructor de movimiento // constructor de copia es noexcept(false) std::vector<int> v; }; class V { public: std::vector<int> v; }; int main() { T t; U u; V v; std::cout << std::boolalpha << "¿puede_lanzar() es noexcept? " << noexcept(puede_lanzar()) << '\n' << "¿no_lanza() es noexcept? " << noexcept(no_lanza()) << '\n' << "¿lpuede_lanzar() es noexcept? " << noexcept(lpuede_lanzar()) << '\n' << "¿lno_lanza() es noexcept? " << noexcept(lno_lanza()) << '\n' << "¿~T() es noexcept? " << noexcept(std::declval<T>().~T()) << '\n' // nota: las siguientes pruebas también requieren que ~T() sea noexcept porque // la expresión dentro de noexcept construye y destruye un temporal << "¿T(rvalue T) es noexcept? " << noexcept(T(std::declval<T>())) << '\n' << "¿T(lvalue T) es noexcept? " << noexcept(T(t)) << '\n' << "¿U(rvalue U) es noexcept? " << noexcept(U(std::declval<U>())) << '\n' << "¿U(lvalue U) es noexcept? " << noexcept(U(u)) << '\n' << "¿V(rvalue V) es noexcept? " << noexcept(V(std::declval<V>())) << '\n' << "¿V(lvalue V) es noexcept? " << noexcept(V(v)) << '\n'; }
Salida:
¿puede_lanzar() es noexcept? false ¿no_lanza() es noexcept? true ¿lpuede_lanzar() es noexcept? false ¿lno_lanza() es noexcept? true ¿~T() es noexcept? true ¿T(rvalue T) es noexcept? true ¿T(lvalue T) es noexcept? true ¿U(rvalue U) es noexcept? false ¿U(lvalue U) es noexcept? false ¿V(rvalue V) es noexcept? true ¿V(lvalue V) es noexcept? false