C++标准中何处规定std::function的目标对象析构不得抛出异常?
解答
结论
- 标准没有专门的条款要求
std::function的目标对象析构函数不能抛出异常,你没有遗漏相关规则。 std::function的析构函数在C++17及之后的版本默认就是noexcept的,这是语言通用规则决定的,不需要标准库单独声明。
具体说明
- C++17对析构函数的
noexcept默认属性做了修改:所有没有被用户显式声明为noexcept(false)的析构函数,都会被默认判定为noexcept。这条是语言层面的通用规则,对所有自定义类和标准库类都生效,std::function也不例外。 - 如果
std::function所持有的目标对象析构时抛出异常,而std::function的析构是noexcept的,会直接触发std::terminate终止程序,这是noexcept函数抛出异常时的标准行为,不需要标准库单独对目标对象的析构做额外约束。 - C++14版本中析构函数默认不是
noexcept,但标准允许标准库实现为函数添加比标准要求更严格的noexcept标注,所以多数主流实现都会主动把std::function的析构标记为noexcept,这种情况下目标析构抛异常同样会触发程序终止。 - 你提到的
Cpp17CopyConstructible要求只约束了目标对象的拷贝构造属性,确实没有涉及析构的异常规则,因为这部分已经被语言层面的析构默认noexcept规则覆盖了。
内容的提问来源于stack exchange,提问作者Alex Guteniev
相关产品推荐
相关产品推荐

