std::expected<T,E>::operator=

来自cppreference.com
< cpp‎ | utility‎ | expected
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(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)
 
 
constexpr expected& operator=( const expected& other );
(1) (C++23 起)
constexpr expected& operator=( expected&& other ) noexcept(/*see below*/);
(2) (C++23 起)
template< class U = T >
constexpr expected& operator=( U&& v );
(3) (C++23 起)
(T 不是 cv void)
template< class G >
constexpr expected& operator=( const unexpected<G>& other );
(4) (C++23 起)
template< class G >
constexpr expected& operator=( unexpected<G>&& other );
(5) (C++23 起)

为一个现存的 expected 对象赋予新值。

1,2) 赋值 other 的状态。
  • 如果 this->has_value() 等于 other.has_value(),赋予 other 中储存的值。在 T 是(可能有 cv 限定的) voidother.has_value()true 时什么也不做。
  • 否则,销毁当前储存的值(在 this->has_value()trueT 是(可能有 cv 限定的) void) 时什么也不做),使得 *this 包含 other 中储存的值的副本。
other.has_value()trueT 是(可能有 cv 限定的) void 时,不构造新值。否则,新值视情况从 *otherother.error() 拷贝构造 (1) 或移动构造 (2) 。如果抛出异常,则旧值被保留, *this 不会变得无值。

如果没有抛出异常,在赋值后 has_value() 等于 other.has_value()

3) 从期待的值赋值。
  • 如果 this->has_value()true ,等价于 *this = std::forward<U>(v)
  • 否则,销毁 *this 中包含的值,并使得 *this 包含从 std::forward<U>(v) 初始化的值。如果抛出异常,则旧值被保留, *this 不会变得无值。

如果没有抛出异常,在赋值后, this->has_value()true

时才会参与重载决议
4,5) 从不期待的值赋值。

GF 对于重载 (4)const G&,对于重载 (5)G

  • 如果 this->has_value()true ,销毁 *this 中包含的值(在 T 是(可能有 cv 限定的) void) 时什么也不做),并且使 *this 包含从 std::forward<GF>(e.error()) 初始化的值。如果抛出异常,则旧值被保留, *this 不会变得无值。
  • 否则,等价于 this->error() = std::forward<GF>(e.error())

如果没有抛出异常,在赋值后, this->has_value()false

时才会参与重载决议

所有情况下,如果 T 不是(可能有 cv 限定的) void ,旧值的析构和新值的构造是如同通过仅用于阐释的函数 reinit_expected 进行的。

template< class NewType, class OldType, class... Args >
constexpr void reinit_expected( NewType& new_val, OldType& old_val, Args&&... args ) {
    if constexpr (std::is_nothrow_constructible_v<NewType, Args...>) {
        std::destroy_at(std::addressof(old_val));
        std::construct_at(std::addressof(new_val), std::forward<Args>(args)...);
    } else if constexpr (std::is_nothrow_move_constructible_v<NewType>) {
        NewType temp(std::forward<Args>(args)...);
        std::destroy_at(std::addressof(old_val));
        std::construct_at(std::addressof(new_val), std::move(temp));
    } else {
        OldType temp(std::move(old_val));
        std::destroy_at(std::addressof(old_val));
        try {
            std::construct_at(std::addressof(new_val), std::forward<Args>(args)...);
        } catch (...) {
            std::construct_at(std::addressof(old_val), std::move(temp));
            throw;
        }
    }
}

参数

other - 其他 expected 对象,其所含的值用于赋值
value - 用于赋值所含值的值
e - std::unexpected 对象,其所含的值用于赋值

返回值

*this

异常

1) 抛出任何 TE 的复制构造函数或复制赋值运算符所抛的异常。
2) 如果 T 是(可能有 cv 限定的) void 否则,
3) 抛出任何 T 的构造函数或赋值运算符所抛的异常。
4,5) 抛出任何 E 的构造函数或赋值运算符所抛的异常。

示例

参阅

在原位构造期待的值
(公开成员函数)