std::unexpected
定义在头文件 <expected> 中 |
||
template< class E > class unexpected; |
(自 C++23 起) | |
类模板 std::unexpected
表示存储在 std::expected 中的意外值。特别是,std::expected 有使用 std::unexpected
作为单个参数的构造函数,它会创建一个 expected
对象,其中包含意外值。
如果程序实例化了一个非对象类型、数组类型、std::unexpected
的特化或 cv 限定类型的 unexpected
,则该程序格式不正确。
内容 |
[编辑] 模板参数
E | - | 意外值的类型。该类型不能是数组类型、非对象类型、std::unexpected 的特化或 cv 限定类型。 |
[编辑] 成员函数
(C++23) |
构造 unexpected 对象(公有成员函数) |
(析构函数) (隐式声明) (C++23) |
销毁 unexpected 对象,以及存储的值(公有成员函数) |
operator= (隐式声明) (C++23) |
分配存储的值 (公有成员函数) |
(C++23) |
访问存储的值 (公有成员函数) |
(C++23) |
交换存储的值 (公有成员函数) |
[编辑] 非成员函数
(C++23) |
比较存储的值 (函数模板) |
(C++23) |
专门化 std::swap 算法 (函数模板) |
std::unexpected::unexpected
constexpr unexpected( const unexpected& ) = default; |
(1) | (自 C++23 起) |
constexpr unexpected( unexpected&& ) = default; |
(2) | (自 C++23 起) |
template< class Err = E > constexpr explicit unexpected( Err&& e ); |
(3) | (自 C++23 起) |
template< class... Args > constexpr explicit unexpected( std::in_place_t, Args&&... args ); |
(4) | (自 C++23 起) |
template< class U, class... Args > constexpr explicit unexpected( std::in_place_t, |
(5) | (自 C++23 起) |
构造一个 std::unexpected
对象。
E
的值一样。- 只有当
- std::is_same_v<std::remove_cvref_t<Err>, unexpected> 为假,并且
- std::is_same_v<std::remove_cvref_t<Err>, std::in_place_t> 为假,并且
- std::is_constructible_v<E, Err> 为真时,此重载才会参与重载解析。
E
的值一样。- 仅当 std::is_constructible_v<E, Args...> 为真时,此重载才参与重载解析。
E
的值进行初始化一样。- 仅当 std::is_constructible_v<E, std::initializer_list<U>&, Args...> 为真时,此重载才参与重载解析。
参数
e | - | 用于初始化包含值的 value |
args... | - | 用于初始化包含值的 arguments |
il | - | 用于初始化包含值的 initializer list |
异常
抛出 E
的构造函数抛出的任何异常。
std::unexpected::error
constexpr const E& error() const& noexcept; constexpr E& error() & noexcept; |
(自 C++23 起) | |
返回对存储值的引用。
std::unexpected::swap
constexpr void swap( unexpected& other ) noexcept(std::is_nothrow_swappable_v<E>); |
(自 C++23 起) | |
交换存储的值,如同使用 using std::swap; swap(error(), other.error()); 一样。
如果 std::is_swappable_v<E> 为假,则程序格式错误。
operator==(std::unexpected)
template< class E2 > friend constexpr bool operator==( unexpected& x, std::unexpected<E2>& y ); |
(自 C++23 起) | |
比较存储的值,如同使用 return x.error() == y.error() 一样。
如果表达式 x.error() == e.error() 格式不正确,或者其结果无法转换为 bool,则程序格式错误。
此函数对普通的 非限定 或 限定查找 不可見,仅当 std::unexpected<E> 是参数的关联类时,才能通过 依赖于参数的查找 找到它。
swap(std::unexpected)
friend constexpr void swap( unexpected& x, unexpected& y ) noexcept(noexcept(x.swap(y))); |
(自 C++23 起) | |
等同于 x.swap(y)。
仅当 std::is_swappable_v<E> 为真时,此重载才参与重载解析。
此函数对普通的 非限定 或 限定查找 不可見,仅当 std::unexpected<E> 是参数的关联类时,才能通过 依赖于参数的查找 找到它。
[edit] 推导指南
template< class E > unexpected(E) -> unexpected<E>; |
(自 C++23 起) | |
为 unexpected 提供了 推导指南,以允许从构造函数参数进行推导。
[edit] 备注
在 C++17 之前,名称 std::unexpected 表示当违反动态异常规范时由 C++ 运行时调用的函数。
[edit] 示例
#include <expected> #include <iostream> enum class error { compile_time_error, runtime_error }; [[nodiscard]] auto unexpected_runtime_error() -> std::expected<int, error> { return std::unexpected(error::runtime_error); } int main() { std::expected<double, int> ex = std::unexpected(3); if (!ex) std::cout << "ex contains an error value\n"; if (ex == std::unexpected(3)) std::cout << "The error value is equal to 3\n"; const auto e = unexpected_runtime_error(); e.and_then([](const auto& e) -> std::expected<int, error> { std::cout << "and_then: " << int(e); // not printed return {}; }) .or_else([](const auto& e) -> std::expected<int, error> { std::cout << "or_else: " << int(e); // prints this line return {}; }); }
输出
ex contains an error value The error value is equal to 3 or_else: 1
[edit] 另请参阅
构造 expected 对象(公有成员函数) | |
(C++23) |
比较 expected 对象(函数模板) |