Использование спецификатора noexcept в объявлении функции и определении?

Рассмотрим следующую функцию:

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

Я хочу сделать эту функцию noexcept, если тип T не конструктивен.

Как это сделать? (Я имею в виду, что такое синтаксис?)

Ответы

Ответ 1

Вот так:

#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

Но также см. Почему шаблоны могут быть реализованы только в файле заголовка?. Вы (вообще) не можете реализовать шаблон в исходном файле.

Ответ 2

noexcept может принимать выражение, и если значение выражения равно true, функция объявляется как исключающая исключения. Таким образом, синтаксис:

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

}

Изменить: использование std::is_nothrow_constructible<T>::value, как показано ниже, немного менее грязно. В этом случае