Namespaces
Variants

std::optional<T>:: operator=

From cppreference.net
Utilities library
optional & operator = ( std:: nullopt_t ) noexcept ;
(1) (自 C++17 起)
(自 C++20 起为 constexpr)
constexpr optional & operator = ( const optional & other ) ;
(2) (自 C++17 起)
constexpr optional & operator =
( optional && other ) noexcept ( /* 见下文 */ ) ;
(3) (自 C++17 起)
template < class U >
optional & operator = ( const optional < U > & other ) ;
(4) (自 C++17 起)
(自 C++20 起为 constexpr)
template < class U >
optional & operator = ( optional < U > && other ) ;
(5) (自 C++17 起)
(自 C++20 起为 constexpr)
template < class U = std:: remove_cv_t < T > >
optional & operator = ( U && value ) ;
(6) (自 C++17 起)
(自 C++20 起为 constexpr)

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

1) * this 包含值,则调用 val  - > T :: ~T ( ) 销毁所含值;否则无效果。此调用后 * this 不再包含值。
2-5) other 的状态进行赋值。此调用后 has_value() 返回 other. has_value ( )
效果 * this 包含值 * this 不包含值
other 包含值
  • 对于重载 (2,4) ,将 * other 赋值给所含值
  • 对于重载 (3,5) ,将 std :: move ( * other ) 赋值给所含值
  • 对于重载 (2,4) ,使用 * other 对所含值进行 直接非列表初始化
  • 对于重载 (3,5) ,使用 std :: move ( * other ) 对所含值进行直接非列表初始化
other 不包含值 通过调用 val  - > T :: ~T ( ) 销毁所含值 无效果
2) std:: is_copy_constructible_v < T > std:: is_copy_assignable_v < T > false ,则赋值运算符被定义为已删除。
std:: is_trivially_copy_constructible_v < T > std:: is_trivially_copy_assignable_v < T > std:: is_trivially_destructible_v < T > 均为 true ,则赋值运算符为平凡(trivial)的。
3) 此重载仅当 std:: is_move_constructible_v < T > std:: is_move_assignable_v < T > 均为 true 时参与重载决议。
std:: is_trivially_move_constructible_v < T > std:: is_trivially_move_assignable_v < T > std:: is_trivially_destructible_v < T > 均为 true ,则赋值运算符为平凡的。
4,5) 这些重载仅在满足以下所有条件时参与重载决议:
6) * this 包含值,则将 std:: forward < U > ( value ) 赋值给所含值;否则使用 std:: forward < U > ( value ) 直接非列表初始化所含值。此调用后 * this 将始终包含值。
此重载仅在满足以下所有条件时参与重载决议:
  1. 换言之, T 不能从任何类型为(可能带有 const 限定符) std:: optional < U > 的表达式构造、转换或赋值

目录

参数

other - 另一个 optional 对象,其包含的值将被赋值
value - 将要赋值给被包含值的具体数值

返回值

* this

异常

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

注释

一个可选对象 op 可以通过 op = { } ; op = nullopt ; 两种方式转换为空可选对象。第一个表达式使用 { } 构造一个空的 optional 对象并将其赋值给 op

特性测试宏 标准 特性
__cpp_lib_optional 202106L (C++20)
(DR20)
完全 constexpr ( 1 ) , ( 4-6 )

示例

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

输出:

abc def

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告 适用范围 发布时行为 修正后行为
LWG 3886 C++17 重载版本 ( 6 ) 的默认模板参数为 T 改为 std:: remove_cv_t < T >
P0602R4 C++17 拷贝/移动赋值运算符可能非平凡
即使底层操作是平凡的
要求传播平凡性
P2231R1 C++20 重载版本 ( 1,4-6 ) 不是 constexpr 改为 constexpr

参见

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