Namespaces
Variants

std::experimental::optional<T>:: operator=

From cppreference.net
optional & operator = ( std:: experimental :: nullopt_t ) noexcept ;
(1) (库基础技术规范)
optional & operator = ( const optional & other ) ;
(2) (库基础技术规范)
optional & operator = ( optional && other ) noexcept ( /* see below */ ) ;
(3) (库基础技术规范)
template < class U >
optional & operator = ( U && value ) ;
(4) (库基础技术规范)

* this 的内容替换为 other 的内容。

1) 若调用前 * this 已包含值,则通过调用其析构函数销毁所含值,方式如 val - > T :: ~T ( ) 。此调用后 * this 不再包含值。
2,3) other 的状态进行赋值。
  • 如果 * this other 均不包含值,则函数无实际效果。
  • 如果 * this 包含值而 other 不包含值,则通过调用析构函数销毁所包含的值。 * this 在调用后不再包含值。
  • 如果 other 包含值,则根据 * this 是否包含值,所包含的值将通过 直接初始化 或从 * other (2) std :: move ( * other ) (3) 进行赋值。请注意被移动的 optional 仍然 包含值
4) 仅衰减的完美转发赋值:根据调用前 * this 是否包含值,所包含的值要么从 std:: forward < U > ( value ) 直接初始化,要么从 std:: forward < U > ( value ) 赋值。除非 std:: is_same < std:: decay_t < U > , T > :: value true ,否则该函数不参与重载决议。

目录

参数

other - 另一个 optional 对象,其包含的值将被赋值
value - 要赋值给所含值的值
类型要求
-
T 必须满足 CopyAssignable CopyConstructible 的要求才能使用重载 (2)。
-
T 必须满足 MoveAssignable MoveConstructible 的要求才能使用重载 (3)。

返回值

* this

异常

2-4) 抛出 T 的构造函数或赋值运算符抛出的任何异常。若抛出异常,则 * this (及 (2) 情形下的 other )的初始化状态保持不变,即若对象已包含值,则仍包含值,反之亦然。 value 的内容及 * this other 所含值的内容取决于引发异常的操作(拷贝构造、移动赋值等)的异常安全保证。
(3) 具有如下 noexcept 声明:
noexcept 说明符:

注释

一个可选对象 op 可以通过 op = { } ; op = nullopt ; 两种方式转换为空可选对象。

示例

#include <experimental/optional>
#include <iostream>
int main()
{
    std::experimental::optional<const char*> s1 = "abc", s2; // 构造函数
    s2 = s1; // 赋值操作
    s1 = "def"; // 退化赋值 (U = char[4], T = const char*)
    std::cout << *s2 << ' ' << *s1 << '\n';
}

输出:

abc def

参见

就地构造所含值
(公开成员函数)