std::optional<T>:: operator=
|
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 ( /* 詳細は後述 */ ) ; |
(3) | (C++17以降) |
|
template
<
class
U
>
optional & operator = ( const optional < U > & other ) ; |
(4) |
(C++17以降)
(C++20以降constexpr) |
|
template
<
class
U
>
optional & operator = ( optional < U > && other ) ; |
(5) |
(C++17以降)
(C++20以降constexpr) |
|
template
<
class
U
=
std::
remove_cv_t
<
T
>
>
optional & operator = ( U && value ) ; |
(6) |
(C++17以降)
(C++20以降constexpr) |
* this の内容を other の内容で置き換えます。
val
-
>
T
::
~T
(
)
を呼び出して保持されている値を破棄する。そうでない場合は何も行わない。
*
this
はこの呼び出しの後、値を保持していない状態となる。
| 効果 | * this が値を保持している場合 | * this が値を保持していない場合 |
|---|---|---|
| other が値を保持している場合 |
|
|
| other が値を保持していない場合 |
保持されている値を
val
-
>
T
::
~T
(
)
を呼び出して破棄する
|
効果なし |
-
以下の12個の値はすべて
false
[1]
です:
- std:: is_constructible_v < T, std:: optional < U > & >
- std:: is_constructible_v < T, const std:: optional < U > & >
- std:: is_constructible_v < T, std:: optional < U > && >
- std:: is_constructible_v < T, const std:: optional < U > && >
- std:: is_convertible_v < std:: optional < U > & , T >
- std:: is_convertible_v < const std:: optional < U > & , T >
- std:: is_convertible_v < std:: optional < U > && , T >
- std:: is_convertible_v < const std:: optional < U > && , T >
- std:: is_assignable_v < T & , std:: optional < U > & >
- std:: is_assignable_v < T & , const std:: optional < U > & >
- std:: is_assignable_v < T & , std:: optional < U > && >
- std:: is_assignable_v < T & , const std:: optional < U > && >
- オーバーロード (4) に対して、 std:: is_constructible_v < T, const U & > および std:: is_assignable_v < T & , const U & > がともに true である場合。
- オーバーロード (5) の場合、 std:: is_constructible_v < T, U > と std:: is_assignable_v < T & , U > がともに true である。
- std:: decay_t < U > (C++20まで) std:: remove_cvref_t < U > (C++20から) が std:: optional < T > ではないこと。
- std:: is_constructible_v < T, U > が true であること。
- std:: is_assignable_v < T & , U > が true であること。
-
以下のいずれかの条件が満たされること:
-
Tが スカラ型 ではないこと。 -
std::
decay_t
<
U
>
が
Tではないこと。
-
-
↑
言い換えれば、
Tは型(const修飾されている可能性もある) std:: optional < U > の任意の式から構築可能、変換可能、または代入可能ではありません。
目次 |
パラメータ
| other | - |
別の
optional
オブジェクト(その含まれる値を代入する)
|
| value | - | 含まれる値に代入する値 |
戻り値
* this
例外
T
のコンストラクタまたは代入演算子によってスローされる例外をスローする。例外がスローされた場合、
*
this
の初期化状態(および
(
2-5
)
の場合の
other
)は変更されない。つまり、オブジェクトが値を含んでいた場合は依然として値を含み、その逆も同様である。
value
の内容および
*
this
と
other
の含む値は、例外の発生元となる操作(コピーコンストラクタ、ムーブ代入など)の例外安全保証に依存する。
std:: is_nothrow_move_constructible_v < T > )
注記
オプショナルオブジェクト
op
は、以下の両方の方法で空のオプショナルに変換できます:
op
=
{
}
;
および
op
=
nullopt
;
。最初の式は
{
}
を使用して空の
optional
オブジェクトを構築し、
op
に代入します。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_optional
|
202106L
|
(C++20)
(DR20) |
完全な constexpr ( 1 ) , ( 4-6 ) |
例
#include <iostream> #include <optional> int main() { std::optional<const char*> s1 = "abc", s2; // コンストラクタ s2 = s1; // 代入 s1 = "def"; // 減衰代入 (U = char[4], T = const char*) std::cout << *s2 << ' ' << *s1 << '\n'; }
出力:
abc def
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 3886 | C++17 |
オーバーロード
(
6
)
のデフォルトテンプレート引数は
T
であった
|
std:: remove_cv_t < T > に変更 |
| P0602R4 | C++17 |
コピー/ムーブ代入演算子は、基盤となる操作がtrivialであっても
trivialではない可能性があった |
trivial性を伝播することが要求される |
| P2231R1 | C++20 | オーバーロード ( 1,4-6 ) は constexpr ではなかった | constexpr 化された |
関連項目
|
包含されている値をその場で構築する
(公開メンバ関数) |