std::optional<T>::operator=
提供: cppreference.com
optional& operator=( std::nullopt_t ) noexcept; |
(1) | (C++17以上) |
constexpr optional& operator=( const optional& other ); |
(2) | (C++17以上) |
constexpr optional& operator=( optional&& other ) noexcept(/* see below */); |
(3) | (C++17以上) |
template< class U = T > optional& operator=( U&& value ); |
(4) | (C++17以上) |
template< class U > optional& operator=( const optional<U>& other ); |
(5) | (C++17以上) |
template< class U > optional& operator=( optional<U>&& other ); |
(6) | (C++17以上) |
*this の内容を other
の内容で置き換えます。
1) 呼び出し前に *this が値を格納している場合、 value().T::~T() によって行われたかのように、格納されている値がそのデストラクタを呼ぶことによって破棄されます。 呼び出し後、 *this ��値を格納していない状態になります。
2-3)
other
の状態を代入します。
- *this と
other
がどちらも値を格納していない場合、この関数は効果を持ちません。 - *this は値を格納しているけれども
other
は値を格納していない場合、格納されている値がそのデストラクタを呼ぶことによって破棄されます。 -
other
が値を格納している場合、 *this が値を格納しているかどうかによって、格納されている値が *other (2) または std::move(*other) (3) から直接初期化または代入されます。 ムーブされた optional は引き続き値を格納していることに注意してください。 - オーバーロード (2) は、 std::is_copy_constructible_v<T> と std::is_copy_assignable_v<T> がどちらも true でなければ、削除されたものとして定義されます。 オーバーロード (2) は、 std::is_trivially_copy_constructible_v<T>、 std::is_trivially_copy_assignable_v<T> および std::is_trivially_destructible_v<T> がすべて true であれば、トリビアルです。
- オーバーロード (3) は、std::is_move_constructible_v<T> と std::is_move_assignable_v<T> がどちらも true でなければ、削除されたものとして定義されます。 オーバーロード (3) は、 std::is_trivially_move_constructible_v<T>、 std::is_trivially_move_assignable_v<T> および std::is_trivially_destructible_v<T> がすべて true であれば、トリビアルです。
4) 完全転送された代入。 呼び出し前に *this が値を格納しているかどうかによって、格納されている値が std::forward<U>(value) から直接初期化されるか、 std::forward<U>(value) から代入されます。 この関数は、 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 でないか、以下の少なくとも1つが true でなければ、オーバーロード解決に参加しません。
-
T
がスカラー型でない - std::decay_t<U> が
T
でない
5-6)
other
の状態を代入します。
- *this と
other
がどちらも値を格納していない場合、この関数は効果を持ちません。 - *this は値を格納しているけれども
other
は値を格納していない場合、格納されている値がそのデストラクタを呼ぶことによって破棄されます。 呼び出し後 *this は値を格納していない状態になります。 -
other
が値を格納している場合、 *this が値を格納しているかどうかによって、格納されている値が *other (5) または std::move(*other) (6) から直接初期化または代入されます。 ムーブされた optional は引き続き値を格納していることに注意してください。 - これらのオーバーロードは、以下の条件が満たされなければ、オーバーロード解決に参加しません。
-
T
が std::optional<U> (またはその const 修飾された) 型の任意の式から構築可能でなく、変換可能でなく、代入可能でもない、すなわち以下の12の型特性がすべて false である- 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>&&>.
- オーバーロード (5) については、 std::is_constructible_v<T, const U&> と std::is_assignable_v<T&, const U&> がどちらも true である
- オーバーロード (6) については、 std::is_constructible_v<T, U> と std::is_assignable_v<T&, U> がどちらも true である
-
目次 |
[編集] 引数
other | - | 代入する値を格納している別の optional オブジェクト
|
value | - | 格納されている値に代入する値 |
[編集] 戻り値
*this。
[編集] 例外
2-6)
T
のコンストラクタまたは代入演算子によって投げられるあらゆる例外を投げます。 例外が投げられた場合、 *this ((2-3), (5-6) の場合は other
も) の初期化状態は変更されません。 つまり、オブジェクトが値を格納している場合、そのオブジェクトは引き続き値を格納している状態であり、逆も同様です。 *this および other
に格納されている値および value
の内容は、その例外の発生元の操作 (コピー代入、ムーブ代入、など) の例外安全性保証に依存します。 (3) は以下の noexcept 指定を持ちます。
noexcept 指定:
noexcept(std::is_nothrow_move_assignable<T>::value && std::is_nothrow_move_constructible<T>::value)
[編集] ノート
optional オブジェクト op
は、 op = {}; および op = nullopt; の両方で、空の optional に変換できます。 最初の式は {} で空の optional オブジェクトを構築し、それを op
に代入します。
[編集] 例
Run this code
#include <optional> #include <iostream> int main() { std::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
[編集] 欠陥報告
以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。
DR | 適用先 | 発行時の動作 | 正しい動作 |
---|---|---|---|
P0602R4 | C++17 | copy/move assignment operator may not be trivial even if underlying operations are trivial | required to propagate triviality |
[編集] 関連項目
格納される値をその場で構築します (パブリックメンバ関数) |