Namespaces
Variants

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

From cppreference.net
Utilities library
(Anmerkung: Der bereitgestellte HTML-Code enthält keinen übersetzbaren Text, da alle Tags leer sind. Die Struktur bleibt unverändert, wie angefordert.)
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)
Hilfsfunktionsvorlage
template < class T, class U, class ... Args >
constexpr void /*reinit-expected*/ ( T & newval, U & oldval, Args && ... args )
(10) (seit C++23)
( Nur zur Darstellung* )

Weist einem bestehenden expected -Objekt einen neuen Wert zu.

Inhaltsverzeichnis

Parameter

other - ein weiteres expected -Objekt, dessen enthaltene Werte zugewiesen werden sollen
v - Wert, der dem enthaltenen Wert zugewiesen werden soll
e - std::unexpected -Objekt, dessen enthaltene Werte zugewiesen werden sollen
newval - der zu konstruierende enthaltene Wert
oldval - der zu zerstörende enthaltene Wert
args - die als Initialisierer für newval verwendeten Argumente

Effekte

Primäre Template-Zuweisungsoperatoren

1,2) Weist den Zustand von other an * this zu.
Wenn has_value() und rhs. has_value ( ) unterschiedliche Werte haben (d.h. einer von * this und other enthält einen erwarteten Wert val und der andere enthält einen unerwarteten Wert unex ), wird die nur zur Darstellung dienende Funktionsvorlage reinit-expected aufgerufen, um den Zustand sicher zu aktualisieren.
1) Der enthaltene Wert wird wie folgt zugewiesen:
Wert von
has_value()
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
has_value()
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 ( ) ) ;
Dann, falls keine Exception ausgelöst wurde, führt es has_val = other. has_value ( ) ; aus.
3) Der Erwartungswert wird wie folgt zugewiesen:
Wert von
has_value()
Entspricht
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
has_value()
Entspricht
( 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 ( ) ) ;

void Partielle Spezialisierungs-Zuweisungsoperatoren

6) Der unerwartete Wert wird wie folgt zugewiesen oder zerstört:
Wert von
has_value()
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 wie folgt zugewiesen oder zerstört:
Wert von
has_value()
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
has_value()
Entspricht
( 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 ( ) ) ;

Hilfsfunktionsvorlage

Die nur zur Darstellung dienende Funktionsvorlage 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)
{
    // Fall 1: Die Konstruktion von „new_val“ ist nicht-werfend:
    // „new_val“ kann direkt nach der Zerstörung von „old_val“ konstruiert werden
    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)...);
    }
    // Fall 2: Die Move-Konstruktion von „new_val“ ist nicht-werfend:
    // Konstruiere zuerst ein temporäres NewType-Objekt
    // („old_val“ bleibt unverändert, falls eine Exception von dieser Konstruktion geworfen wird)
    else if constexpr (std::is_nothrow_move_constructible_v<NewType>)
    {
        NewType temp(std::forward<Args>(args)...); // kann werfen
        std::destroy_at(std::addressof(old_val));
        std::construct_at(std::addressof(new_val), std::move(temp));
    }
    // Fall 3: Die Konstruktion von „new_val“ ist potenziell-werfend:
    // Eine Sicherungskopie von „old_val“ ist erforderlich, um von einer Exception zu regenerieren
    else
    {
        OldType temp(std::move(old_val)); // kann werfen
        std::destroy_at(std::addressof(old_val));
        try
        {
            std::construct_at(std::addressof(new_val),
                              std::forward<Args>(args)...); // kann werfen
        }
        catch (...)
        {
            std::construct_at(std::addressof(old_val), std::move(temp));
            throw;
        }
    }
}

Diese Funktionsvorlage wird aufgerufen, wenn die Zuweisung bewirken wird, 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. Allerdings könnte die Konstruktion von newval eine Exception werfen. Um die starke Exception-Sicherheitsgarantie zu gewährleisten, muss der alte Wert vor dem erneuten Werfen der Exception wiederhergestellt werden, damit * this einen gültigen Zustand hat, während die Exception behandelt wird.

Rückgabewert

1-9) * this

Einschränkungen und ergänzende Informationen

Primäre Template-Zuweisungsoperatoren

2) Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn alle folgenden Werte true sind:
3) Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:
4) Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn alle folgenden Werte true sind:
5) Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn alle folgenden Werte true sind:

void Partielle Spezialisierungs-Zuweisungsoperatoren

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 dann an der Überladungsauflösung teil, wenn std:: is_move_constructible_v < E > und std:: is_move_assignable_v < E > beide true sind.
8) Diese Überladung nimmt nur dann an der Überladungsauflösung 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 dann an der Überladungsauflösung teil, wenn std:: is_constructible_v < E, G > und std:: is_assignable_v < E & , G > beide true sind.

Exceptions

Beispiel

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 3886 C++23 das Standard-Template-Argument von Überladung ( 3 ) war T geändert zu std:: remove_cv_t < T >
LWG 4025 C++23 Überladung ( 7 ) war als gelöscht definiert, wenn E nicht
move-konstruierbar oder nicht move-zuweisbar ist
sie nimmt in diesem Fall nicht an der
Überladungsauflösung teil

Siehe auch

Konstruiert den erwarteten Wert direkt vor Ort
(öffentliche Mitgliedsfunktion)