C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- 变量模板(C++14 起)
- 整数字面量
- 聚合初始化
- 比较运算符
- 默认比较(C++20 起)
- 转义序列
- for 循环
- while 循环
- 用户定义转换
- SFINAE
- 主函数
- ASCII 码表
- 标识符
- 类型
- 内存模型
- 对象
- 基本概念
- 表达式
- 声明
- 初始化
- 函数
- 语句
- 类
- 运算符重载
- 模板
- 异常
- 事务性内存
- 占位符类型说明符 (C++11 起)
- decltype 说明符
- 函数声明
- final 说明符 (C++11 起)
- override 说明符(C++11 起)
- 引用声明
- 移动构造函数
- 移动赋值运算符
- 枚举声明
- constexpr 说明符(C++11 起)
- 列表初始化 (C++11 起)
- 构造函数与成员初始化器列表
- using 声明
- nullptr,指针字面量
- 基础类型
- 类型别名,别名模版 (C++11 起)
- 形参包
- 联合体声明
- 字符串字面量
- 用户定义字面量 (C++11 起)
- 属性说明符序列(C++11 起)
- Lambda 表达式 (C++11 起)
- noexcept 说明符 (C++11 起)
- noexcept 运算符 (C++11 起)
- alignof 运算符(C++11 起)
- alignas 说明符 (C++11 起)
- 存储类说明符
- 基于范围的 for 循环 (C++11 起)
- static_assert 声明
- 隐式转换
- 代用运算符表示
- 自增/自减运算符
- 折叠表达式(C++17 起)
- 类模板实参推导(C++17 起)
- 模板形参与模板实参
- if 语句
- inline 说明符
- 结构化绑定声明 (C++17 起)
- switch 语句
- 字符字面量
- 命名空间
- 求值顺序
- 复制消除
- consteval 说明符 (C++20 起)
- constinit 说明符 (C++20 起)
- 协程 (C++20)
- 模块 (C++20 起)
- 约束与概念 (C++20 起)
- new 表达式
- do-while 循环
- continue 语句
- break 语句
- goto 语句
- return 语句
- 动态异常说明
- throw 表达式
- try 块
- 命名空间别名
- 类声明
- cv(const 与 volatile)类型限定符
- 默认初始化
- 值初始化(C++03 起)
- 零初始化
- 复制初始化
- 直接初始化
- 常量初始化
- 引用初始化
- 值类别
- C++ 运算符优先级
- 布尔字面量
- 浮点字面量
- typedef 说明符
- 显式类型转换
- static_cast 转换
- dynamic_cast 转换
- const_cast 转换
- reinterpret_cast 转换
- delete 表达式
- 构造函数与成员初始化器列表
- this 指针
- 访问说明符
- 友元声明
- virtual 函数说明符
- explicit 说明符
- 静态成员
- 默认构造函数
- 复制构造函数
- 复制赋值运算符
- 析构函数
- 类模板
- 函数模板
- 显式(全)模板特化
- 汇编声明
- C++ 的历史
- 作用域
- 生存期
- 定义与单一定义规则(ODR)
- 名字查找
- 有限定的名字查找
- 无限定的名字查找
- 如同规则
- 未定义行为
- 翻译阶段
- 常量表达式
- 赋值运算符
- 算术运算符
- 逻辑运算符
- 成员访问运算符
- 其他运算符
- sizeof 运算符
- typeid 运算符
- 指针声明
- 数组声明
- 语言链接
- 详述类型说明符
- 默认实参
- 变长实参
- 实参依赖查找
- 重载决议
- 重载函数的地址
- 注入类名
- 非静态数据成员
- 非静态成员函数
- 嵌套类
- 派生类
- 空基类优化
- 抽象类
- 位域
- 转换构造函数
- 成员模板
- 模板实参推导
- 部分模板特化
- sizeof... 运算符
- 待决名
- 函数 try 块
- 扩充命名空间 std
- 字母缩写
- RAII
- 三/五/零之法则
- PImpl
- 零开销原则
- 类型
- 隐式转换
- 注释
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
noexcept 运算符 (C++11 起)
noexcept
运算符进行编译时检查,若表达式声明为不抛出任何异常则返回 true。
它可用于函数模板的 noexcept 说明符中,以声明函数将对某些类型抛出异常,但不对其他类型抛出。
语法
noexcept( 表达式 )
|
|||||||||
返回 bool 类型的纯右值。
解释
noexcept
运算符不对 表达式 求值。
若 表达式 含有至少一个下列潜在求值的语言构造,则结果为
所有其他情况下结果是 |
(C++17 前) |
若 表达式 的潜在异常集合为空则结果为 |
(C++17 起) |
关键词
示例
运行此代码
#include <iostream> #include <utility> #include <vector> void may_throw(); void no_throw() noexcept; auto lmay_throw = []{}; auto lno_throw = []() noexcept {}; class T{ public: ~T(){} // 析构函数妨碍了移动构造函数 // 复制构造函数为 noexcept }; class U{ public: ~U(){} // 析构函数妨碍了移动构造函数 // 复制构造函数为 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 << "Is may_throw() noexcept? " << noexcept(may_throw()) << '\n' << "Is no_throw() noexcept? " << noexcept(no_throw()) << '\n' << "Is lmay_throw() noexcept? " << noexcept(lmay_throw()) << '\n' << "Is lno_throw() noexcept? " << noexcept(lno_throw()) << '\n' << "Is ~T() noexcept? " << noexcept(std::declval<T>().~T()) << '\n' // 注:以下各项测试也要求 ~T() 为 noexcept // 因为 noexccept 中的表达式构造并销毁了临时量 << "Is T(rvalue T) noexcept? " << noexcept(T(std::declval<T>())) << '\n' << "Is T(lvalue T) noexcept? " << noexcept(T(t)) << '\n' << "Is U(rvalue U) noexcept? " << noexcept(U(std::declval<U>())) << '\n' << "Is U(lvalue U) noexcept? " << noexcept(U(u)) << '\n' << "Is V(rvalue V) noexcept? " << noexcept(V(std::declval<V>())) << '\n' << "Is V(lvalue V) noexcept? " << noexcept(V(v)) << '\n'; }
输出:
Is may_throw() noexcept? false Is no_throw() noexcept? true Is lmay_throw() noexcept? false Is lno_throw() noexcept? true Is ~T() noexcept? true Is T(rvalue T) noexcept? true Is T(lvalue T) noexcept? true Is U(rvalue U) noexcept? false Is U(lvalue U) noexcept? false Is V(rvalue V) noexcept? true Is V(lvalue V) noexcept? false
参阅
noexcept 指定符 | 要求函数不抛出任何异常 (C++11) |
异常说明 | 指定函数所抛出的异常 (弃用) |