std::experimental::optional<T>::operator=
来自 cppreference.cn
< cpp | experimental | optional
optional& operator=( std::experimental::nullopt_t ) noexcept; |
(1) | (库基础 TS) |
optional& operator=( const optional& other ); |
(2) | (库基础 TS) |
optional& operator=( optional&& other ) noexcept(/* 参见下文 */); |
(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,否则函数不参与重载决议。
目录 |
[编辑] 参数
其他 | - | another 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)
[编辑] 注意
一个 optional 对象 op
可以通过 op = {}; 和 op = nullopt; 变为一个空的 optional。
[编辑] 示例
运行此代码
#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
[编辑] 参阅
就地构造包含的值 (public 成员函数) |