C++ 标准节 ID,其中提到析构函数隐式不抛出

c++ standard section id where its mentioned that Destructors are implicitly no throw

本文关键字:析构函数 标准 ID C++      更新时间:2023-10-16

我在某处读到,从 c++11 开始,析构函数被隐式声明为 noexcept(true) .

从标准部分 12.4

没有 异常规范具有与 被隐式声明

但是在标准中我找不到一个部分,其中说析构函数是隐式noexcept(true)的。任何人都可以指出我可以找到此信息的部分吗?

我相信

你正在寻找§15.4/14(强调我的):

继承构造函数 (12.9) 和隐式声明的特殊成员函数(条款 12)具有 异常规范。如果f是继承构造函数或隐式声明的默认构造函数,请复制 构造函数、移动构造函数、析构函数、复制赋值运算符或移动赋值运算符,其隐式 异常规范指定类型 ID T当且仅当异常规范允许Tf的隐式定义直接调用的函数; f允许所有异常,如果有的话,它直接起作用 调用允许所有异常,f 具有异常规范 noexcept(true) 如果每个函数都直接 调用不允许异常。[ 注意:因此f具有例外规范noexcept(true) 如果它不调用其他函数—尾注 ]

15.4/14 中描述了特殊成员的隐式异常规范是如何形成的。 不是很清楚,但基本上是说特殊成员抛出基地的特殊成员和它调用的成员抛出的那些异常;这意味着 a) 如果没有碱基或成员,就不会有任何例外,b) 如果所有碱基和成员都没有抛出异常,就不会有任何例外。最终结果是析构函数noexcept(true),除非任何成员或基的析构函数不是。