假设我有:
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 中却没有。