考虑std::function
定义:
namespace std {
template<class> class function; // not defined
template<class R, class... ArgTypes>
class function<R(ArgTypes...)> {
public:
/* ... */
template<class F> function(F&&);
/* ... */
~function();
/* ... */
};
/* ... */
}
析构函数没有明确标记noexcept
。此声明被解释为它不在noexcept
C++14 中,而是noexcept
从 C++17 开始。实现似乎加强了这一点并noexcept
在 C++14 中标记(这是允许的):https ://godbolt.org/z/WPh8zs7WE
目前的草案对析构函数并没有多说,只是它破坏了目标对象。见[func.wrap.func.con]/31:
~function();
效果:如果
*this != nullptr
,破坏这个目标。
对目标对象的一些要求列在构造函数参数[func.wrap.func.con]/8到[func.wrap.func.con]/11中。具体来说,它是Lvalue -Callable和Cpp17CopyConstructible。
但是,我看不到目标对象析构函数不抛出的指定位置。
是否在任何地方指定?
还是析构函数function
不意味着noexcept?