std::expected<T,E>::operator=
| Primäre Vorlage |
||
constexpr expected& operator=( const expected& other ); |
(1) | (seit C++23) |
constexpr expected& operator=( expected&& other ) noexcept(/* siehe unten */); |
(2) | (seit C++23) |
template< class U = std::remove_cv_t<T> > constexpr expected& operator=( U&& v ); |
(3) | (seit C++23) |
template< class G > constexpr expected& operator=( const std::unexpected<G>& e ); |
(4) | (seit C++23) |
template< class G > constexpr expected& operator=( std::unexpected<G>&& e ); |
(5) | (seit C++23) |
| void partielle Spezialisierung |
||
constexpr expected& operator=( const expected& other ); |
(6) | (seit C++23) |
constexpr expected& operator=( expected&& other ) noexcept(/* siehe unten */); |
(7) | (seit C++23) |
template< class G > constexpr expected& operator=( const std::unexpected<G>& e ); |
(8) | (seit C++23) |
template< class G > constexpr expected& operator=( std::unexpected<G>&& e ); |
(9) | (seit C++23) |
| Hilfsfunktions-Template |
||
| template< class T, class U, class... Args > constexpr void reinit-expected( T& newval, U& oldval, Args&&... args ) |
(10) | (seit C++23) (nur Exposition*) |
Weist einem bestehenden expected-Objekt einen neuen Wert zu.
Inhalt |
[edit] Parameter
| Sonstiges | - | ein weiteres expected-Objekt, dessen enthaltener Wert zugewiesen werden soll |
| v | - | Wert, der dem enthaltenen Wert zugewiesen werden soll |
| e | - | std::unexpected-Objekt, dessen enthaltener Wert zugewiesen werden soll |
| newval | - | der zu konstruierende enthaltene Wert |
| oldval | - | der zu zerstörende enthaltene Wert |
| args | - | die Argumente, die als Initialisierer von newval verwendet werden |
[edit] Effekte
[edit] Zuweisungsoperatoren für die primäre Template
has_value() und rhs.has_value() unterschiedliche Werte haben (d. h. eines von *this und other enthält einen erwarteten Wert val und das andere einen unerwarteten Wert unex), wird die expositions-nur-Funktion reinit-expected aufgerufen, um den Zustand sicher zu aktualisieren.Wert vonhat_wert()
|
Wert von other.has_value() | |
|---|---|---|
| true | false | |
| true | val = *other;
|
reinit-expected (unex, val, other.error());
|
| false | reinit-expected (val, unex, *other);
|
unex = other.error();
|
Wert vonhat_wert()
|
Wert von other.has_value() | |
|---|---|---|
| true | false | |
| true | val = std::move(*other);
|
reinit-expected (unex, val, std::move(other.error()));
|
| false | reinit-expected (val, unex, std::move(*other));
|
unex = std::move(other.error());
|
has_val = other.has_value();.Wert vonhat_wert()
|
Äquivalent zu |
|---|---|
| true | val = std::forward<U>(v);
|
| false | reinit-expected(val, unex, std::forward<U>(v));has_val = false;
|
| Überladung | Wert vonhat_wert()
|
Äquivalent zu |
|---|---|---|
| (4) | true | reinit-expected(val, unex, std::forward<const G&>(e.error()));has_val = false;
|
| false | unex = std::forward<const G&>(e.error());
| |
| (5) | true | reinit-expected(val, unex, std::forward<G>(e.error()));has_val = false;
|
| false | unex = std::forward<G>(e.error());
|
[edit] void Zuweisungsoperatoren für die partielle Spezialisierung
Wert vonhat_wert()
|
Wert von other.has_value() | |
|---|---|---|
| true | false | |
| true | (keine Effekte) | std::construct_at (std::addressof(unex), rhs.unex);has_val = false;
|
| false | std::destroy_at(std::addressof(unex));has_val = true;
|
unex = other.error();
|
Wert vonhat_wert()
|
Wert von other.has_value() | |
|---|---|---|
| true | false | |
| true | (keine Effekte) | std::construct_at (std::addressof(unex), std::move(rhs.unex));has_val = false;
|
| false | std::destroy_at(std::addressof(unex));has_val = true;
|
unex = std::move(other.error());
|
| Überladung | Wert vonhat_wert()
|
Äquivalent zu |
|---|---|---|
| (8) | true | std::construct_at(std::addressof(unex), std::forward<const G&>(e.error()));has_val = false;
|
| false | unex = std::forward<const G&>(e.error());
| |
| (9) | true | std::construct_at(std::addressof(unex), std::forward<G>(e.error()));has_val = false;
|
| false | unex = std::forward<G>(e.error());
|
[edit] Hilfsfunktions-Template
Die expositions-nur-Funktion reinit-expected wird wie folgt "definiert"
template<class NewType, class OldType, class... Args> constexpr void reinit-expected(NewType& new_val, OldType& old_val, Args&&... args) { // Case 1: the construction of “new_val” is non-throwing: // “new_val” can be directly constructed after destroying “old_val” if constexpr (std::is_nothrow_constructible_v<NewType, Args...>) { std::destroy_at(std::addressof(old_val)); std::construct_at(std::addressof(new_val), std::forward<Args>(args)...); } // Case 2: the move construction of “new_val” is non-throwing: // constuct a temporary NewType object first // (“old_val” is left intact if an exception is thrown from this construction) else if constexpr (std::is_nothrow_move_constructible_v<NewType>) { NewType temp(std::forward<Args>(args)...); // may throw std::destroy_at(std::addressof(old_val)); std::construct_at(std::addressof(new_val), std::move(temp)); } // Case 3: the construction of “new_val” is potentially-throwing: // a backup of “old_val” is required in order to recover from an exception else { OldType temp(std::move(old_val)); // may throw std::destroy_at(std::addressof(old_val)); try { std::construct_at(std::addressof(new_val), std::forward<Args>(args)...); // may throw } catch (...) { std::construct_at(std::addressof(old_val), std::move(temp)); throw; } } }
Diese Funktions-Template wird aufgerufen, wenn die Zuweisung dazu führt, dass *this den alternativen Wert enthält (d. h. vom erwarteten Wert zum unerwarteten Wert oder vom unerwarteten Wert zum erwarteten Wert).
In diesem Fall muss der alte Wert oldval zerstört werden, bevor der neue Wert newval konstruiert wird. Die Konstruktion von newval kann jedoch eine Ausnahme auslösen. Um die starke Ausnahme-Sicherheitsgarantie zu bieten, muss der alte Wert wiederhergestellt werden, bevor die Ausnahme erneut ausgelöst wird, damit *this einen gültigen Zustand hat, während die Ausnahme behandelt wird.
[edit] Rückgabewert
[edit] Constraints und zusätzliche Informationen
[edit] Zuweisungsoperatoren für die primäre Template
- std::is_same_v<expected, std::remove_cvref_t<U>> ist false.
- std::remove_cvref_t<U> ist keine Spezialisierung von
std::unexpected. - Alle folgenden Werte sind true
- std::is_constructible_v<E, const G&>
- std::is_assignable_v<E&, const G&>
- std::is_nothrow_constructible_v<E, const G&> || std::is_nothrow_move_constructible_v<T> ||
std::is_nothrow_move_constructible_v<E>
[edit] void Zuweisungsoperatoren für die partielle Spezialisierung
[edit] Ausnahmen
std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_assignable_v<T> &&
[edit] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3886 | C++23 | Das Standard-Template-Argument der Überladung (3) war T |
geändert zu std::remove_cv_t<T> |
| LWG 4025 | C++23 | Die Überladung (7) war als gelöscht definiert, wenn E nichtmove-konstruierbar oder nicht move-zuweisbar ist |
sie nimmt nicht teil an der Overload Resolution in diesem Fall |
[edit] Siehe auch
| konstruiert den erwarteten Wert in-place (public member function) |