【发布时间】:2013-08-09 15:44:03
【问题描述】:
我已经实现了一个智能指针,它使用调用内部对象方法的代理函数存储类型为 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 和/或
std::function中的智能指针有什么问题? -
它在某些特殊情况下使用写时复制。它使对存储对象线程的所有调用都是安全的。
-
参见here,尤其是“如果标记为
noexcept的函数允许在运行时转义未捕获的异常,则立即调用std::terminate。” -
是的,谢谢,但据我了解,T::function 和这个代理调用都没有标记为 noexcept。我认为 noexcept 运算符会检测到成员函数可以抛出,因为它没有标记为 noexcept..