noexcept
(C++)
C++11:指定某个函数是否可能会引发异常。
语法
noexcept-specifier
:
noexcept
noexcept-expression
throw
(
)
noexcept-expression
:
noexcept
(
constant-expression
)
参数
constant-expression
类型 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
时,它使编译器可以在多种不同的上下文中生成更高效的代码。 有关详细信息,请参阅异常规范。
示例
当要复制的对象是普通的旧数据类型 (POD) 时,可将复制其自变量的函数模板声明为 noexcept
。 此类函数可以如下声明:
#include <type_traits>
template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
{
// ...
}