Use of the noexcept specifier in function declaration and definition?

7k views Asked by At

Consider the following function:

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

I want to make this function noexcept if the type T is nothrow constructible.

How to do that ? (I mean what is the syntax ?)

2

There are 2 answers

0
Angew is no longer proud of SO On BEST ANSWER

Like this:

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

Live example

But please also see Why can templates only be implemented in the header file?. You (generally) cannot implement a template in the source file.

1
Davidbrcz On

noexcept can accept an expression and if the value of the expression is true, the function is declared to not throw any exceptions. So the syntax is :

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()))
{

}

Edit : the use of std::is_nothrow_constructible<T>::value as below is a bit less dirty i that case