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) 指示可以退出函数的潜在异常集是所有类型的集合。

仅当函数直接或间接调用的所有函数也是 noexceptconst 时,才将该函数标记为 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>)
{
   // ...
}

另请参阅

现代 C++ 处理异常和错误的最佳做法
异常规范(thrownoexcept