std::experimental::optional<T>:: operator=
From cppreference.net
<
cpp
|
experimental
|
optional
|
optional
&
operator
=
(
std::
experimental
::
nullopt_t
)
noexcept
;
|
(1) | (库基础技术规范) |
|
optional
&
operator
=
(
const
optional
&
other
)
;
|
(2) | (库基础技术规范) |
|
optional
&
operator
=
(
optional
&&
other
)
noexcept
(
/* see below */
)
;
|
(3) | (库基础技术规范) |
|
template
<
class
U
>
optional & operator = ( U && value ) ; |
(4) | (库基础技术规范) |
将 * this 的内容替换为 other 的内容。
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
,否则该函数不参与重载决议。
目录 |
参数
| other | - |
另一个
optional
对象,其包含的值将被赋值
|
| value | - | 要赋值给所含值的值 |
| 类型要求 | ||
-
T
必须满足
CopyAssignable
和
CopyConstructible
的要求才能使用重载 (2)。
|
||
-
T
必须满足
MoveAssignable
和
MoveConstructible
的要求才能使用重载 (3)。
|
||
返回值
* 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
=
{
}
;
和
op
=
nullopt
;
两种方式转换为空可选对象。
示例
运行此代码
#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
参见
|
就地构造所含值
(公开成员函数) |