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

标签 c++ default exception-specification

假设我有:

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/

相关文章:

c++ - 纯虚类,只有1个派生类,还是vtable?

c++ - 使用 QNetworkAccessManager->Post() 导致 SEGV 关闭应用程序

c# - 如何将目录路径的默认值设置为项目设置

基于经验的 C++ 缺陷

c++ - 使用 sed 从 C++ 代码中删除异常规范

c# - C# 中的 Windows 凭据提供程序

c++ - 如何获取 windows xp gui 默认代码页?

c++ - 为类成员函数的结构输入设置默认值

xcode - 默认Xcode 4.5字体

c++11 - 类外定义的默认 move 操作的异常规范是什么?