Namespaces
Variants

std::optional<T>:: operator=

From cppreference.net
Utilities library
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 の内容で置き換えます。

1) もし * this が値を保持している場合、 val  - > T :: ~T ( ) を呼び出して保持されている値を破棄する。そうでない場合は何も行わない。 * this はこの呼び出しの後、値を保持していない状態となる。
2-5) other の状態を代入する。 has_value() はこの呼び出し後に other. has_value ( ) を返す。
効果 * this が値を保持している場合 * this が値を保持していない場合
other が値を保持している場合
  • オーバーロード (2,4) では、 * other を保持されている値に代入する
  • オーバーロード (3,5) では、 std :: move ( * other ) を保持されている値に代入する
  • オーバーロード (2,4) では、 直接非リスト初期化 * other を保持されている値として初期化する
  • オーバーロード (3,5) では、直接非リスト初期化で std :: move ( * other ) を保持されている値として初期化する
other が値を保持していない場合 保持されている値を val  - > T :: ~T ( ) を呼び出して破棄する 効果なし
2) std:: is_copy_constructible_v < T > または std:: is_copy_assignable_v < T > false の場合、代入演算子は削除定義される。
std:: is_trivially_copy_constructible_v < T > std:: is_trivially_copy_assignable_v < T > および std:: is_trivially_destructible_v < T > がすべて true の場合、代入演算子は自明(trivial)である。
3) このオーバーロードは、 std:: is_move_constructible_v < T > および std:: is_move_assignable_v < T > が両方とも true である場合にのみ、オーバーロード解決に参加します。
std:: is_trivially_move_constructible_v < T > が、 std:: is_trivially_move_assignable_v < T > および std:: is_trivially_destructible_v < T > がすべて true である場合、代入演算子は自明(trivial)である。
4,5) These overloads participate in overload resolution only if all following conditions are satisfied:
6) もし * this が値を保持している場合、 std:: forward < U > ( value ) を保持されている値に代入する。そうでない場合、 std:: forward < U > ( value ) で保持される値を直接非リスト初期化する。 * this はこの呼び出し後に値を保持する。
このオーバーロードは、以下の全ての条件が満たされる場合にのみオーバーロード解決に参加します:
  1. 言い換えれば、 T は型(const修飾されている可能性もある) std:: optional < U > の任意の式から構築可能、変換可能、または代入可能ではありません。

目次

パラメータ

other - 別の optional オブジェクト(その含まれる値を代入する)
value - 含まれる値に代入する値

戻り値

* this

例外

2-6) T のコンストラクタまたは代入演算子によってスローされる例外をスローする。例外がスローされた場合、 * this の初期化状態(および ( 2-5 ) の場合の other )は変更されない。つまり、オブジェクトが値を含んでいた場合は依然として値を含み、その逆も同様である。 value の内容および * this other の含む値は、例外の発生元となる操作(コピーコンストラクタ、ムーブ代入など)の例外安全保証に依存する。

注記

オプショナルオブジェクト 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 化された

関連項目

包含されている値をその場で構築する
(公開メンバ関数)