Namensräume
Varianten
Aktionen

std::expected<T,E>::operator=

Von cppreference.com
< cpp‎ | utility‎ | expected
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
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

1,2) Weist den Zustand von other dem Objekt *this zu.
Wenn 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.
1) Der enthaltene Wert wird wie folgt zugewiesen
Wert von
 hat_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();
2) Der enthaltene Wert wird wie folgt zugewiesen
Wert von
 hat_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());
Wenn keine Ausnahme ausgelöst wurde, wird ausgeführt has_val = other.has_value();.
3) Der erwartete Wert wird wie folgt zugewiesen
Wert von
 hat_wert() 
Äquivalent zu
true val = std::forward<U>(v);
false reinit-expected(val, unex, std::forward<U>(v));
has_val = false;
4,5) Der unerwartete Wert wird wie folgt zugewiesen
 Überladung  Wert von
 hat_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

6) Der unerwartete Wert wird zugewiesen oder zerstört wie folgt
Wert von
 hat_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();
7) Der unerwartete Wert wird zugewiesen oder zerstört wie folgt
Wert von
 hat_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());
8,9) Der unerwartete Wert wird wie folgt zugewiesen
 Überladung  Wert von
 hat_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

1-9) *this

[edit] Constraints und zusätzliche Informationen

[edit] Zuweisungsoperatoren für die primäre Template

1) Diese Überladung ist als gelöscht definiert, es sei denn, alle folgenden Werte sind true
3) Diese Überladung nimmt nur an der Auflösung von Überladungen teil, wenn alle folgenden Bedingungen erfüllt sind
4) Diese Überladung nimmt nur teil, wenn alle folgenden Werte true sind
5) Diese Überladung nimmt nur teil, wenn alle folgenden Werte true sind

[edit] void Zuweisungsoperatoren für die partielle Spezialisierung

6) Diese Überladung ist als gelöscht definiert, es sei denn, std::is_copy_assignable_v<E> und std::is_copy_constructible_v<E> sind beide true.
7) Diese Überladung nimmt nur an der Overload Resolution teil, wenn std::is_move_constructible_v<E> und std::is_move_assignable_v<E> beide true sind.
8) Diese Überladung nimmt nur an der Overload Resolution teil, wenn std::is_constructible_v<E, const G&> und std::is_assignable_v<E&, const G&> beide true sind.
9) Diese Überladung nimmt nur an der Overload Resolution teil, wenn std::is_constructible_v<E, G> und std::is_assignable_v<E&, G> beide true sind.

[edit] Ausnahmen

[edit] 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 nicht
move-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) [edit]