C ++ 11 Exception的析构函数允许现在抛出?

时间:2013-05-14 10:24:29

标签: c++ exception c++11 destructor c++98

任何想法为什么 virtual~exception()throw()在C ++ 98中, 但 virtual~exception()在C ++ 11中?

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

来自here

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;
}

1 个答案:

答案 0 :(得分:28)

  

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

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

  

隐含地认为没有异常规范的析构函数声明   相同的 exception-specification 作为隐式声明(15.4)。

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

  

继承构造函数(12.9)和隐式声明的特殊成员函数(第12条)有一个   异常规范。如果f是继承构造函数或隐式声明的默认构造函数,则复制   构造函数,移动构造函数,析构函数,复制赋值运算符或移动赋值运算符,其隐式   当且仅当异常规范允许T时,exception-specification指定type-id T   由f的隐式定义直接调用的函数; f允许所有异常(如果有任何直接函数)   invokes允许所有异常, f如果每个函数都直接具有异常规范noexcept(true)   调用不允许例外

总之,以上两段保证(鉴于你引用exception的析构函数的声明)exception的析构函数不会抛出。

C ++ 11标准第18.8.1 / 7-8段也明确说明了这一点:

  

virtual ~exception();

     

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

     

8 备注不会抛出任何异常

请注意,C ++ 11中不推荐使用动态异常规范(例如throw())。附件D的第§D.4/ 1条:

  

不推荐使用动态异常规范