假设我有:
class Foo
{
public:
virtual ~Foo()=default;
};
默认析构函数的异常规范是什么?默认的析构函数是否等同于:
virtual ~Foo() {};
or
virtual ~Foo() throw() {};
or
virtual ~Foo() noexcept {};
C++11 标准的第 15.4 节说它取决于析构函数的隐式定义直接调用的函数的异常规范。在这种情况下,没有成员,也没有基类,所以 AFAIK 没有隐式析构函数直接调用的函数。这是标准中的歧义(或遗漏)吗?
当然,这很重要,因为如果它隐式具有 throw(),那么所有子类都必须使用 throw() 声明它们的析构函数。不要告诉我在析构函数中抛出异常是个坏主意,我知道。我处理许多根本没有使用异常规范的遗留代码。
作为一个信息点,当我尝试时:
class SubFoo : public Foo
{
public:
virtual ~SubFoo();
};
我在 GCC 4.4 中遇到错误(不匹配的异常规范)(尽管我承认我可能没有正确的命令行开关),但在使用“11”编译器的 XCode 4.3 中却没有。
最佳答案
回到同一句话的前面(§15.4/14):
...its implicit exception-specification specifies the type-id T if and only if T is allowed by the exception-specification of a function directly invoked by f’s implicit definition;..."
因此,如果 ~Foo
不调用任何函数,它有一个不允许抛出异常的隐式声明。
根据§15.4/3:
Two exception-specifications are compatible if:
- both are non-throwing (see below), regardless of their form,
这里就是这种情况,所以声明是 throw()
还是 noexcept
并不重要——两者在任何情况下都是兼容的。
关于c++ - C++11 中默认虚拟析构函数的异常规范是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10731131/