《C++ Primer Plus》第六版
15.3.5 异常规范和C++11
有时候,一种理念看似有前途,但实际的使用效果并不好。一个?这样的例子是异常规范,这是c++98新增的一项功能,但c++11却将其摒弃了。这意味着c++11仍然处于标准之中,但以后可能会从标准中剔除,因此不建议您使用它。
然而,忽视异常规范前,您至少知道它是什么样的,如下所示:
double harm(double a) throw(bad_thing);
double marm(double a) throw();
其冲throw()部分就是异常规范,它可能出现在函数原型和函数定义中,可包含类型列表,也可不包含。
异常规范的作用之一是,让编译器添加执行运行阶段检查的代码,检查是否违反了异常规范。这很难检查。例如,marm()可能不会引发异常,但库更新后它却会引发异常。总之,编程社区达成的一致是,最好不好使用这项功能。而c++11也建议您忽略异常规范。
然而,c++11确实支持一种特殊的异常规范:您可使用新增的关键字noexcept指出函数不会引发异常:
double marm(double a) noexcept;
有关这种异常规范是否有必要和有用存在一些争议,有些人认为最好不要使用它,而有些人认为引入这个新关键字很有必要,理由是知道函数不会引发异常有助于编译器优化代码。通过使用这个关键字,编写函数的程序员相当于做出了承诺。
还有运算符noexcept()它判断其操作数是否会引发异常。