4

我已经实现了一个智能指针,它使用调用内部对象方法的代理函数存储类型为 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 运算符是否正确,如果不是,在这种情况下我应该如何使用它?

4

1 回答 1

4

根据 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,因为成员函数指针没有限定noexcept

noexcept是对函数指针类型的限定,例如const. 由于函数指针类型call接受不是noexcept- 限定的,复杂的noexcept(noexcept(...))将始终评估为noexcept(false).

编辑:下面是不正确的,不可能仅仅基于noexcept函数指针的限定来重载,因为“异常规范不被认为是函数类型的一部分。” (§15.4/13)

如果你想在callnoexcept定一个noexcept-qualified 成员函数指针时,你需要提供一个重载call(R (T::*)() const noexcept, ...)

于 2013-08-09T15:59:40.403 回答