std::optional<T>::operator=
提供: cppreference.com
<tbody>
</tbody>
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 |
関連項目
| 格納される値をその場で構築します (パブリックメンバ関数) |