You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++标准中何处规定std::function的目标对象析构不得抛出异常?

解答

结论

  1. 标准没有专门的条款要求std::function的目标对象析构函数不能抛出异常,你没有遗漏相关规则。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:15:03