C ++:noexcept(或throw())virtual destructor = default;

时间:2014-01-19 08:29:39

标签: c++ destructor

以下代码是合法的吗?

class C
{
    virtual ~C() noexcept = default;
};

class C
{
    virtual ~C() throw() = default;
};

(throw()已弃用,但我的编译器不支持noexcept ;;)

1 个答案:

答案 0 :(得分:4)

  

8.4.2 [dcl.fct.def.default] 明确默认的函数[...]只有在与异常兼容(15.4)时才有明确的异常规范 - 隐含声明中的特定内容。

  

15.4 / 3 [except.spec] 如果符合以下条件,则两个异常规范兼容:

     
      
  • 两者都是非投掷品(见下文),无论其形式如何,
  •   
  • 都具有noexcept(constant-expression)形式,而constant-expression是等价的,或
  •   
  • 两者都是具有相同调整类型集的动态异常规范。
  •   

因此,如果它与析构函数的隐式声明完全匹配,那么你只能给出一个明确的异常规范。

隐式析构函数具有的异常规范取决于它将调用的函数:

  

15.4 / 14 [except.spec] 隐式声明的特殊成员函数应具有异常规范。如果f是一个隐式声明的析构函数,它的隐式异常规范指定了type-id T当且仅当T被f的隐式定义直接调用的函数的异常指定所允许时;如果它直接调用的任何函数允许所有异常,则f应允许所有异常,如果它直接调用的每个函数都不允许异常,则f不允许异常。

析构函数调用的函数是类的非静态数据成员,其基类和虚拟基类的析构函数。

在您的情况下,由于该类没有数据成员且没有基类,因此它不调用任何函数,因此它属于最终情况。它直接调用的每个函数(没有)都不允许异常,所以这个析构函数必须不允许异常。因此,您的异常规范必须是非抛弃的,因此nothrowexcept()exception(constant expression that yields true)是您可以提供的唯一合适的异常规范,因此您的代码很好。< / p>