noexcept
运算符 (自 C++11 起)
来自 cppreference.com
noexcept
运算符执行一个编译时检查,如果一个表达式声明为不会抛出任何异常,则返回 true。
它可以在函数模板的 noexcept 说明符 中使用,以声明该函数将为某些类型抛出异常,而为其他类型不抛出异常。
内容 |
[编辑] 语法
noexcept( 表达式 ) |
|||||||||
返回 右值 类型为 bool。如果 表达式 的 潜在异常集 为空(直到 C++17)表达式 被指定为 不抛出(自 C++17 起),则结果为 true;否则结果为 false。
表达式 是一个 未求值的操作数。
如果 表达式 是右值,则应用 临时物质化。 |
(自 C++17 起) |
[编辑] 注释
即使 noexcept(expr) 为 true,expr 的求值也可能由于遇到未定义行为而抛出异常。
如果 表达式 是类类型或(可能的多维)数组,则临时物质化需要析构函数为非删除的且可访问的。 |
(自 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(){} // 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 中已弃用) |