我实现了一个智能指针,该指针使用代理函数存储类型为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限定成员函数指针的情况下希望noexceptnoexcept,则需要提供重载call(R (T::*)() const noexcept, ...)

08-27 01:56