命名空间
变体
操作

std::unexpected

来自 cppreference.com
< cpp‎ | utility‎ | expected
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
 
定义在头文件 <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 限定类型。

[编辑] 成员函数

构造 unexpected 对象
(公有成员函数)
(析构函数)
(隐式声明) (C++23)
销毁 unexpected 对象,以及存储的值
(公有成员函数)
operator=
(隐式声明) (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,

                               std::initializer_list<U> il, Args&&... args );
(5) (自 C++23 起)

构造一个 std::unexpected 对象。

1,2) 复制/移动构造函数。分别复制或移动存储的值。
3) 构造存储的值,就好像使用 直接初始化std::forward<Err>(e) 初始化类型为 E 的值一样。
4) 构造存储的值,就好像使用 直接初始化 从参数 std::forward<Args>(args)... 初始化类型为 E 的值一样。
5) 使用 直接初始化 从参数 il, std::forward<Args>(args)... 构造存储的值,如同对类型 E 的值进行初始化一样。

参数

e - 用于初始化包含值的 value
args... - 用于初始化包含值的 arguments
il - 用于初始化包含值的 initializer list

异常

抛出 E 的构造函数抛出的任何异常。

std::unexpected::error

constexpr const E& error() const& noexcept;

constexpr E& error() & noexcept;
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 对象
(公有成员函数) [edit]
比较 expected 对象
(函数模板) [edit]