c++ c++11 noexcept

c++ - ¿Uso del especificador noexcept en la declaración de función y definición?



c++11 (2)

Me gusta esto:

#include <type_traits> // Declaration in the .h file class MyClass { public: template <class T> void function(T&& x) noexcept(std::is_nothrow_constructible<T>::value); }; // Definition in the .cpp file template <class T> void MyClass::function(T&& x) noexcept(std::is_nothrow_constructible<T>::value);

Ejemplo vivo

Pero también vea ¿Por qué las plantillas solo se pueden implementar en el archivo de encabezado? . Usted (generalmente) no puede implementar una plantilla en el archivo fuente.

Considere la siguiente función:

// Declaration in the .h file class MyClass { template <class T> void function(T&& x) const; }; // Definition in the .cpp file template <class T> void MyClass::function(T&& x) const;

Quiero hacer esta función noexcept si el tipo T es construible.

Como hacer eso ? (Quiero decir, ¿cuál es la sintaxis?)


noexcept puede aceptar una expresión y si el valor de la expresión es verdadero, se declara que la función no lanza ninguna excepción. Así que la sintaxis es:

class MyClass { template <class T> void function(T&& x) noexcept (noexcept(T())); }; // Definition in the .cpp file template <class T> void MyClass::function(T&& x) noexcept (noexcept(T())) { }

Edición: el uso de std::is_nothrow_constructible<T>::value como se muestra a continuación es un poco menos sucio en ese caso