C++ 11中默认虚拟析构函数的异常规范是什么?

use*_*050 9 c++ default exception-specification

假设我有:

class Foo
{
public:
   virtual ~Foo()=default;
};
Run Code Online (Sandbox Code Playgroud)

默认析构函数的异常规范是什么?违约的析构函数是否相当于:

   virtual ~Foo() {};
or
   virtual ~Foo() throw() {};
or
   virtual ~Foo() noexcept {};
Run Code Online (Sandbox Code Playgroud)

C++ 11标准的第15.4节说它依赖于析构函数的隐式定义直接调用的函数的异常规范.在这种情况下,没有成员,也没有基类,因此AFAIK没有隐式析构函数直接调用的函数.这是标准中的含糊不清(或遗漏)吗?

当然,这很重要,因为如果它隐式具有throw(),那么所有子类必须使用throw()声明它们的析构函数.不要告诉我在析构函数中抛出异常是个坏主意,我知道.我处理了许多遗留代码,其中根本没有使用异常规范.

作为一个信息点,当我尝试时:

class SubFoo : public Foo
{
public:
   virtual ~SubFoo();
};
Run Code Online (Sandbox Code Playgroud)

我在GCC 4.4中得到了一个错误(不匹配的异常规范)(尽管我承认我可能没有正确的命令行开关),但在使用"11"编译器的XCode 4.3中却没有.

Jer*_*fin 4

备份到同一句话中的较早位置 (\xc2\xa715.4/14):

\n
\n

...其隐式异常规范指定类型 ID T 当且仅当由 f\xe2\x80\x99s 隐式定义直接调用的函数的异常规范允许 T 时;...”

\n
\n

因此,如果~Foo不调用任何函数,它就有一个隐式声明,不允许抛出异常。

\n

根据\xc2\xa715.4/3:

\n
\n

如果满足以下条件,则两个异常规范是兼容的:

\n
    \n
  • 无论其形式如何,两者都是非投掷的(见下文),
  • \n
\n
\n

throw()这里就是这种情况,所以声明是或并不重要noexcept——两者在任何情况下都是兼容的。

\n