我实现了一个智能指针,该指针使用代理函数存储类型为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运算符是否正确?如果没有,在这种情况下应如何使用?
最佳答案
根据C++ 11§5.3.7/ 1:
计算表达式(function)
不会引发异常,因此noexcept(function)
的计算结果为true
。请注意,这与评估表达式(*function)(std::forward<Params>(args)...)
不同,由于成员函数指针不是合格的noexcept((*function)(std::forward<Params>(args)...))
,因此false
肯定会评估为noexcept
。noexcept
是对诸如const
之类的函数指针类型的限定。由于call
接受的函数指针类型不是noexcept
限定的,因此复杂的noexcept(noexcept(...))
将始终评估为noexcept(false)
。
编辑:以下内容是不正确的,因为“异常说明不被视为函数类型的一部分,”纯基于函数指针的noexcept
限定是不可能的。 (§15.4/ 13)
如果在给定call
限定成员函数指针的情况下希望noexcept
为noexcept
,则需要提供重载call(R (T::*)() const noexcept, ...)
。