命名空间
变体
操作

noexcept 运算符 (C++11 起)

来自 cppreference.cn
< cpp‎ | language
 
 
C++ 语言
通用主题
流程控制
条件执行语句
if
迭代语句 (循环)
for
范围 for (C++11 起)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常声明 (直到 C++17*)
noexcept 说明符 (C++11 起)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11 起)
auto (C++11 起)
constexpr (C++11 起)
consteval (C++20)
constinit (C++20)
存储期说明符
初始化
表达式
替用表示
字面量
布尔 - 整数 - 浮点
字符 - 字符串 - nullptr (C++11 起)
用户定义 (C++11 起)
工具
属性 (C++11 起)
类型
typedef 声明
类型别名声明 (C++11 起)
转型
内存分配
类特有的函数属性
虚函数
override 说明符 (C++11 起)  
final 说明符 (C++11 起)
explicit (C++11 起)
static

特殊成员函数
模板
模板特化
形参包 (C++11 起)
杂项
 
 
异常
try
抛出异常
处理异常
异常声明
    noexcept 声明 (C++11 起)
    动态声明 (直到 C++17*)
noexcept 运算符 (C++11 起)
 

noexcept 运算符执行编译时检查,若表达式声明为不抛出任何异常,则返回 true

它可以在函数模板的 noexcept 声明 中使用,以声明函数将为某些类型抛出异常,但不为其他类型抛出异常。

内容

[编辑] 语法

noexcept( 表达式 )

返回 纯右值,类型为 bool。若 表达式潜在异常 集为空(直到 C++17)表达式 被指定为 非抛出(C++17 起),则结果为 true,否则为 false

表达式 是一个 未求值运算数

如果 表达式 是纯右值,则应用临时量实体化

(C++17 起)

[编辑] 注解

即使 noexcept(expr)true,求值 expr 仍可能因遇到未定义行为而抛出异常。

表达式 属于类类型或其(可能为多维)数组,临时量实体化要求析构函数为非删除且可访问的。

(C++17 起)

[编辑] 关键词

noexcept

[编辑] 示例

#include <iostream>
#include <utility>
#include <vector>
 
void may_throw();
void no_throw() noexcept;
auto lmay_throw = []{};
auto lno_throw = []() noexcept {};
 
class T
{
public:
    ~T(){} // dtor prevents move ctor
           // copy ctor is noexcept
};
 
class U
{
public:
    ~U(){} // dtor prevents move ctor
           // copy ctor is noexcept(false)
    std::vector<int> v;
};
 
class V
{
public:
    std::vector<int> v;
};
 
int main()
{
    T t;
    U u;
    V v;
 
    std::cout << std::boolalpha <<
        "may_throw() is noexcept(" << noexcept(may_throw()) << ")\n"
        "no_throw() is noexcept(" << noexcept(no_throw()) << ")\n"
        "lmay_throw() is noexcept(" << noexcept(lmay_throw()) << ")\n"
        "lno_throw() is noexcept(" << noexcept(lno_throw()) << ")\n"
        "~T() is noexcept(" << noexcept(std::declval<T>().~T()) << ")\n"
        // note: the following tests also require that ~T() is noexcept because
        // the expression within noexcept constructs and destroys a temporary
        "T(rvalue T) is noexcept(" << noexcept(T(std::declval<T>())) << ")\n"
        "T(lvalue T) is noexcept(" << noexcept(T(t)) << ")\n"
        "U(rvalue U) is noexcept(" << noexcept(U(std::declval<U>())) << ")\n"
        "U(lvalue U) is noexcept(" << noexcept(U(u)) << ")\n"
        "V(rvalue V) is noexcept(" << noexcept(V(std::declval<V>())) << ")\n"
        "V(lvalue V) is noexcept(" << noexcept(V(v)) << ")\n";
}

输出

may_throw() is noexcept(false)
no_throw() is noexcept(true)
lmay_throw() is noexcept(false)
lno_throw() is noexcept(true)
~T() is noexcept(true)
T(rvalue T) is noexcept(true)
T(lvalue T) is noexcept(true)
U(rvalue U) is noexcept(false)
U(lvalue U) is noexcept(false)
V(rvalue V) is noexcept(true)
V(lvalue V) is noexcept(false)

[编辑] 缺陷报告

下列行为更改缺陷报告被追溯性地应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
CWG 2722 C++17 不清楚是否应用临时量实体化
如果 表达式 是纯右值
应用
在此情况下
CWG 2792 C++11 noexcept 运算符需要确定异常是否
可能在遇到未定义行为的情况下抛出
不需要

[编辑] 参见

noexcept 说明符(C++11 起) 指定函数是否可能抛出异常[编辑]
动态异常声明(直到 C++17) 指定函数抛出哪些异常 (C++11 中已弃用) [编辑]