在函数声明和定义中使用noexcept说明符?

时间:2013-12-30 10:29:53

标签: c++ c++11 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

怎么做? (我的意思是语法是什么?)

2 个答案:

答案 0 :(得分:21)

像这样:

#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

但请同时查看Why can templates only be implemented in the header file?。您(通常)无法在源文件中实现模板。

答案 1 :(得分:7)

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如下所示,这种情况不那么脏了