14

知道为什么 virtual ~exception() throw() 在 C++98 中,但 virtual ~exception() 在 C++11 中吗?

允许 C++11 加入类的析构函数的设计决策是什么exception

这里

c++98:

class exception {
public:
  exception () throw();
  exception (const exception&) throw();
  exception& operator= (const exception&) throw();
  virtual ~exception() throw();
  virtual const char* what() const throw();
}

c++11:

class exception {
public:
  exception () noexcept;
  exception (const exception&) noexcept;
  exception& operator= (const exception&) noexcept;
  virtual ~exception();
  virtual const char* what() const noexcept;
}
4

1 回答 1

28

什么是设计决定使 C++11 允许放入类的析构函数exception

没有这样的设计决定(幸运的是!)。在 C++11 中,即使是显式声明的析构函数也是noexcept默认限定的。这可以从 C++11 标准的第 12.4/3 段中得到证明:

没有异常规范的析构函数声明被隐式认为具有与隐式声明(15.4)相同的异常规范。

从第 15.4/14 段开始,它指定了隐式声明具有的异常规范:

继承构造函数 (12.9) 和隐式声明的特殊成员函数 (Clause 12) 具有异常规范。Iff是继承构造函数或隐式声明的默认构造函数、复制构造函数、移动构造函数、析构函数、复制赋值运算符或移动赋值运算符,其隐式异常规范指定类型 IDT当且仅当T异常规范允许f 的隐式定义直接调用的函数;f如果它直接调用的任何函数都允许所有异常,则允许所有异常,并且如果它直接调用的每个函数都不允许异常,f则具有异常规范noexcept(true)

上面两段一起保证(给定你引用exception的析构函数的声明)析构函数exception不会抛出。

这也在 C++11 标准的第 18.8.1/7-8 段中明确说明:

virtual ~exception();

7效果:销毁类异常的对象。

8备注不抛出任何异常

请注意,动态异常规范(例如throw())在 C++11 中已弃用。根据附件 D 的第 D.4/1 节:

不推荐使用动态异常规范

于 2013-05-14T10:26:11.783 回答