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中却没有.
备份到同一句话中的较早位置 (\xc2\xa715.4/14):
\n\n\n...其隐式异常规范指定类型 ID T 当且仅当由 f\xe2\x80\x99s 隐式定义直接调用的函数的异常规范允许 T 时;...”
\n
因此,如果~Foo不调用任何函数,它就有一个隐式声明,不允许抛出异常。
根据\xc2\xa715.4/3:
\n\n\n如果满足以下条件,则两个异常规范是兼容的:
\n\n
\n- 无论其形式如何,两者都是非投掷的(见下文),
\n
throw()这里就是这种情况,所以声明是或并不重要noexcept——两者在任何情况下都是兼容的。