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);
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