如何正确使用noexcept运算符

时间:2013-08-09 15:44:03

标签: c++ c++11 noexcept

我已经实现了一个智能指针,它存储一个T类型的对象,该代理函数调用内部对象的方法:

template <class Function, class ...Args, class ...Params> 
inline bool call( Function (T::*function)(Args...) const, Params&& ...args ) const noexcept( noexcept( function ));

但是我发现了一个奇怪的问题 - 当在成员函数中生成std :: exception时,程序终止,即使在try块中调用了代理函数。所以我的问题是:使用noexcept运算符是否正确,如果没有,在这种情况下我应该如何使用它呢?

1 个答案:

答案 0 :(得分:4)

Per C ++11§5.3.7/ 1:

  

noexcept运算符确定对其操作数(即未评估的操作数(第5条))的求值是否可以抛出异常(15.1)。

评估表达式(function)不能抛出异常,因此noexcept(function)的计算结果为true。请注意, 与评估表达式(*function)(std::forward<Params>(args)...)相同,noexcept((*function)(std::forward<Params>(args)...))肯定会计算为false,因为成员函数指针不合格{{1 }}

noexcept是对noexcept等函数指针类型的限定。由于函数指针类型const接受的不是call - 合格,因此复杂的noexcept将始终评估为noexcept(noexcept(...))

编辑:以下是不正确的,因为“An exception-specification 不被视为函数的一部分,所以不可能纯粹基于函数指针的noexcept(false)限定而过载类型。” (§15.4/ 13)

如果您希望noexcept在给定call限定成员函数指针时为noexcept,则需要提供重载noexcept