c ++标准节id其中提到Destructors是隐式没有抛出的

时间:2015-01-20 13:07:07

标签: c++ exception c++11 destructor language-lawyer

我在某处读过,自c ++ 11以来,析构函数被隐式声明为noexcept(true)

来自标准第12.4节

  

没有。的析构函数的声明   异常规范具有与之相同的异常规范   被隐含地宣布

但是在标准中没有任何地方可以找到一个部分,其中包含析构函数隐式noexcept(true)。有人能指出我可以找到这些信息的部分吗?

2 个答案:

答案 0 :(得分:3)

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

  

继承构造函数(12.9)和隐式声明的特殊成员函数(第12条)有一个   异常规范。如果f是继承构造函数或隐式声明的默认构造函数,则复制   构造函数,移动构造函数,析构函数,复制赋值运算符或移动赋值运算符,其隐式   当且仅当异常规范允许T时,exception-specification指定type-id T   由f的隐式定义直接调用的函数; f允许所有异常(如果有任何直接函数)   invokes允许所有异常,并且f具有异常规范noexcept(true),如果它直接每个函数   invokes不允许例外。 [注意: 以下f具有例外规范noexcept(true)   如果它不调用其他功能 -end note]

答案 1 :(得分:3)

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