std::experimental::optional<T>::operator=
来自 cppreference.com
< cpp | experimental | optional
optional& operator=( std::experimental::nullopt_t ) noexcept; |
(1) | (库基础 TS) |
optional& operator=( const optional& other ); |
(2) | (库基础 TS) |
optional& operator=( optional&& other ) noexcept(/* see below */); |
(3) | (库基础 TS) |
template< class U > optional& operator=( U&& value ); |
(4) | (库基础 TS) |
用 other 的内容替换 *this 的内容。
1) 如果在调用之前 *this 包含一个值,则通过调用其析构函数来销毁包含的值,就好像通过 val->T::~T() 一样。此调用之后 *this 不包含值。
2,3) 分配 other 的状态。
- 如果 *this 和 other 都没有包含值,则该函数没有任何效果。
- 如果 *this 包含一个值,但 other 没有,则通过调用其析构函数销毁包含的值。此调用之后 *this 不包含值。
- 如果 other 包含一个值,则根据 *this 是否包含一个值,包含的值将通过 直接初始化 从 *other (2) 或 std::move(*other) (3) 分配。
4) 仅衰减完美转发赋值:根据在调用之前 *this 是否包含一个值,包含的值将通过从 std::forward<U>(value) 直接初始化或从 std::forward<U>(value) 分配。除非 std::is_same<std::decay_t<U>, T>::value 为 true,否则该函数不会参与重载解析。
内容 |
[编辑] 参数
other | - | 另一个要分配其包含值的 optional 对象 |
value | - | 要分配给包含值的 value |
类型需求 | ||
-T 必须满足 CopyAssignable 和 CopyConstructible 的需求才能使用重载 (2)。 | ||
-T 必须满足 MoveAssignable 和 MoveConstructible 的需求才能使用重载 (3)。 |
[编辑] 返回值
*this
[编辑] 异常
2-4) 抛出
(3) 具有以下 noexcept 声明
T
的构造函数或赋值运算符抛出的任何异常。如果抛出异常,*this(以及在 (2) 情况下为 other)的初始化状态保持不变,也就是说,如果对象包含一个值,它仍然包含一个值,反之亦然。 value 的内容以及 *this 和 other 的包含值取决于导致异常的操作(复制构造函数、移动赋值等)的异常安全性保证。(3) 具有以下 noexcept 声明
noexcept 规范:
noexcept(std::is_nothrow_move_assignable<T>::value && std::is_nothrow_move_constructible<T>::value)
[编辑] 注释
一个可选对象op
可以通过两种方式转换为一个空可选对象:op = {}; 和 op = nullopt;.
[编辑] 示例
运行此代码
#include <experimental/optional> #include <iostream> int main() { std::experimental::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
[编辑] 另请参阅
在原地构造包含的值 (公共成员函数) |