我已经实现了一个智能指针,它存储一个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运算符是否正确,如果没有,在这种情况下我应该如何使用它呢?
答案 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
。