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

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


person Vincent    schedule 30.12.2013    source источник
comment
вы можете уточнить у std::is_nothrow_constructible   -  person Jarod42    schedule 30.12.2013
comment
Я знаю, но я никогда раньше не использовал ключевое слово noexcept, поэтому мне интересно, каков синтаксис.   -  person Vincent    schedule 30.12.2013
comment
из каких аргументов ничего нельзя построить? В ответах предполагается, что вы имеете в виду не конструировать по умолчанию а-ля T foo;, но с функцией, принимающей универсальную ссылку, интересно, имеете ли вы в виду не конструируемость из аргумента функции а-ля T foo{std::forward<T>(x)};.   -  person Casey    schedule 30.12.2013


Ответы (2)


Как это:

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

Живой пример

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

person Angew is no longer proud of SO    schedule 30.12.2013

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

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

person Davidbrcz    schedule 30.12.2013
comment
Технически noexcept(noexcept(T())) не означает, что T можно построить без исключения; это означает, что T может быть создан и уничтожен без исключения. Вам нужно использовать noexcept(noexcept(::new (nullptr) T())). - person Zizheng Tai; 19.07.2016