类型
bool
的常数表达式,表示潜在异常类型集是否为空。 无条件版本相当于
noexcept(true)
。
noexcept-expression
是一种异常规范:一个函数声明的后缀,代表了一组可能由异常处理程序匹配的类型,用于处理退出函数的任何异常。 当
constant_expression
生成
true
时,一元条件运算符
noexcept(constant_expression)
及其无条件同义词
noexcept
指定可以退出函数的潜在异常类型集为空。 也就是说,该函数绝不会引发异常,也绝不允许在其范围外传播异常。 当
constant_expression
生成
false
或缺少异常规范(析构函数或解除分配函数除外),运算符
noexcept(constant_expression)
指示可以退出函数的潜在异常集是所有类型的集合。
仅当函数直接或间接调用的所有函数也是
noexcept
或
const
时,才将该函数标记为
noexcept
。 编译器不一定会检查可能归因于
noexcept
函数的异常的每个代码路径。 如果异常确实退出标记为
noexcept
的函数的外部范围,则会立即调用
std::terminate
,并且不会保证将调用任何范围内对象的析构函数。 使用
noexcept
而不是动态异常说明符
throw()
。 动态异常规范(
throw(optional_type_list)
规范)在 C++11 中已弃用,并已在 C++17 中删除,但
throw()
除外,它是
noexcept(true)
的别名。 我们建议你将
noexcept
应用到任何绝不允许异常传播到调用堆栈的函数。 当函数被声明为
noexcept
时,它使编译器可以在多种不同的上下文中生成更高效的代码。 有关详细信息,请参阅
异常规范
。
复制其参数的函数模板可能会在复制对象的条件上声明
noexcept
为普通旧数据类型 (POD) 。 此类函数可以如下声明:
#include <type_traits>
template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
// ...
现代 C++ 处理异常和错误的最佳做法
异常规范(throw
、noexcept
)