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) 直接初始化,要么从之赋值。注意被移动的
optional
仍然含有值。
4) 仅退化的完美转发赋值:取决于调用前 *this 是否含有值,所含值要么从 std::forward<U>(value) 直接初始化,要么从 std::forward<U>(value) 赋值。除非 std::is_same<std::decay_t<U>, T>::value 为 true,否则此函数不参与重载决议。
Parameters
other | - | 要赋值其所含值的另一 optional 对象
|
value | - | 要赋给所含值的值 |
类型要求 | ||
- 为使用重载 (2), T 必须满足可复制赋值 (CopyAssignable) 和 可复制构造 (CopyConstructible) 。
| ||
- 为使用重载 (3), T 必须满足可移动赋值 (MoveAssignable) 和 可移动构造 (MoveConstructible) 。
|
返回值
*this
异常
2-4) 抛出
(3) 由如下的
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 = nullopt; 都可以将 optional
对象 op
变为空 optional
。
示例
运行此代码
#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
参阅
原位构造所含值 (公开成员函数) |