命名空间
变体
操作

std::unexpected

来自 cppreference.cn
< cpp‎ | 错误
定义于头文件 <exception>
void unexpected();
(C++11 前)
[[noreturn]] void unexpected();
(C++11 起废弃)
(在 C++17 中已移除)

动态异常规范被违反时,C++ 运行时会调用 `std::unexpected()`:即当从一个禁止该类型异常的函数中抛出异常时。

`std::unexpected()` 也可以直接从程序中调用。

在这两种情况下,`std::unexpected` 都会调用当前安装的 std::unexpected_handler。默认的 std::unexpected_handler 会调用 std::terminate

如果在栈展开过程中析构函数重置了非预期处理程序,且展开随后导致 `unexpected` 被调用,那么将调用在抛出表达式结束时安装的处理程序(注意:关于重新抛出是否应用新处理程序这一点存在歧义)。

(C++11 前)

如果在栈展开过程中析构函数重置了非预期处理程序,并且展开随后导致 `unexpected` 被调用,则调用哪个处理程序是未指定的。

(C++11 起)

[编辑] 异常

抛出当前安装的 std::unexpected_handler 抛出的任何异常。

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 2111 C++11 在栈展开期间调用 std::set_unexpected 的效果
与 C++98 不同,并破坏了一些 ABI
变为未指定

[编辑] 参阅

表示为意外值
(类模板) [编辑]
(C++11 中已废弃)(C++17 中已移除)
std::unexpected 调用的函数类型
(typedef) [编辑]