任何想法为什么 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;
}
答案 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-idT
由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条:
不推荐使用动态异常规范。