Использование спецификатора 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
, как показано ниже, немного менее грязно. В этом случае