命名空间
变体
操作

std::optional<T>::operator=

来自 cppreference.com
< cpp‎ | utility‎ | optional
 
 
实用程序库
语言支持
类型支持 (基本类型,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)

 
 
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(/* see below */);
(3) (自 C++17 起)
template< class U = T >
optional& operator=( U&& value );
(4) (自 C++17 起)
(自 C++20 起为 constexpr)
template< class U >
optional& operator=( const optional<U>& other );
(5) (自 C++17 起)
(自 C++20 起为 constexpr)
template< class U >
optional& operator=( optional<U>&& other );
(6) (自 C++17 起)
(自 C++20 起为 constexpr)

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

1) 如果 *this 在调用之前包含一个值,则包含的值将通过调用其析构函数来销毁,就好像通过 value().T::~T() 一样。 *this 在此调用之后不包含任何值。
2,3) 分配 other 的状态。
4) 完美转发赋值:取决于调用之前*this是否包含值,包含的值要么从std::forward<U>(value)直接初始化,要么从std::forward<U>(value)赋值。除非std::decay_t<U>(直到 C++20)std::remove_cvref_t<U>(从 C++20 开始)不是std::optional<T>std::is_constructible_v<T, U>truestd::is_assignable_v<T&, U>true,并且以下至少一项为真,该函数才参与重载解析。
5,6)other的状态赋予自身。

内容

[编辑] 参数

other - 另一个optional对象,其包含的值要赋值。
value - 要赋值给包含值的 value。

[编辑] 返回值

*this

[编辑] 异常

2-6) 抛出 T 的构造函数或赋值运算符抛出的任何异常。如果抛出异常,则*this(以及(2,3)(5,6)other)的初始化状态保持不变,即如果对象包含值,它仍然包含值,反之亦然。value 的内容以及*thisother 的包含值取决于异常源自的操作(复制构造函数、移动赋值运算符等)的异常安全保障。

[编辑] 说明

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

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

[编辑] 示例

#include <iostream>
#include <optional>
 
int main()
{
    std::optional<const char*> s1 = "abc", s2; // constructor
    s2 = s1; // assignment
    s1 = "def"; // decaying assignment (U = char[4], T = const char*)
    std::cout << *s2 << ' ' << *s1 << '\n';
}

输出

abc def

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用到之前发布的 C++ 标准。

DR 应用于 已发布的行为 正确的行为
P0602R4 C++17 复制/移动赋值运算符可能不是平凡的
即使底层操作是平凡的
要求传播平凡性
P2231R1 C++20 转换赋值运算符 (1)(4-6) 不是 constexpr
虽然在 C++20 中所需的操作可以是
已改为 constexpr

[编辑] 另请参阅

在原地构造包含的值
(公共成员函数) [编辑]