Namespaces
Variants

std::optional<T>:: operator=

From cppreference.net
Utilities library
optional & operator = ( std:: nullopt_t ) noexcept ;
(1) (seit C++17)
(constexpr seit C++20)
constexpr optional & operator = ( const optional & other ) ;
(2) (seit C++17)
constexpr optional & operator =
( optional && other ) noexcept ( /* siehe unten */ ) ;
(3) (seit C++17)
template < class U >
optional & operator = ( const optional < U > & other ) ;
(4) (seit C++17)
(constexpr seit C++20)
template < class U >
optional & operator = ( optional < U > && other ) ;
(5) (seit C++17)
(constexpr seit C++20)
template < class U = std:: remove_cv_t < T > >
optional & operator = ( U && value ) ;
(6) (seit C++17)
(constexpr seit C++20)

Ersetzt den Inhalt von * this durch den Inhalt von other .

1) Wenn * this einen Wert enthält, ruft es val  - > T :: ~T ( ) auf, um den enthaltenen Wert zu zerstören; andernfalls keine Wirkung. * this enthält nach diesem Aufruf keinen Wert.
2-5) Weist den Zustand von other zu. has_value() gibt other. has_value ( ) nach diesem Aufruf zurück.
Effekt * this enthält einen Wert * this enthält keinen Wert
other enthält einen Wert
  • für Überladungen (2,4) , weist * other dem enthaltenen Wert zu
  • für Überladungen (3,5) , weist std :: move ( * other ) dem enthaltenen Wert zu
  • für Überladungen (2,4) , direkt-nicht-Liste-initialisiert den enthaltenen Wert mit * other
  • für Überladungen (3,5) , direkt-nicht-Liste-initialisiert den enthaltenen Wert mit std :: move ( * other )
other enthält keinen Wert zerstört den enthaltenen Wert durch Aufruf von val  - > T :: ~T ( ) kein Effekt
2) Wenn std:: is_copy_constructible_v < T > oder std:: is_copy_assignable_v < T > false ist, wird der Zuweisungsoperator als gelöscht definiert.
Wenn std:: is_trivially_copy_constructible_v < T > , std:: is_trivially_copy_assignable_v < T > und std:: is_trivially_destructible_v < T > alle true sind, dann ist der Zuweisungsoperator trivial.
3) Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn std:: is_move_constructible_v < T > und std:: is_move_assignable_v < T > beide true sind.
Wenn std:: is_trivially_move_constructible_v < T > , std:: is_trivially_move_assignable_v < T > und std:: is_trivially_destructible_v < T > alle true sind, dann ist der Zuweisungsoperator trivial.
4,5) These overloads participate in overload resolution only if all following conditions are satisfied:
6) Wenn * this einen Wert enthält, weist es std:: forward < U > ( value ) dem enthaltenen Wert zu; andernfalls initialisiert es den enthaltenen Wert direkt-nicht-Listen mit std:: forward < U > ( value ) . * this enthält nach diesem Aufruf einen Wert.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:
  1. Mit anderen Worten, T ist nicht konstruierbar, konvertierbar oder zuweisbar von irgendeinem Ausdruck des Typs (möglicherweise const-qualifiziert) std:: optional < U >

Inhaltsverzeichnis

Parameter

other - ein weiteres optional Objekt, dessen enthaltene Wert zugewiesen werden soll
value - Wert, der dem enthaltenen Wert zugewiesen werden soll

Rückgabewert

* this

Exceptions

2-6) Wirft jede Ausnahme, die vom Konstruktor oder Zuweisungsoperator von T geworfen wird. Wenn eine Ausnahme geworfen wird, bleibt der Initialisierungszustand von * this (und von other im Fall von ( 2-5 ) ) unverändert, d.h. wenn das Objekt einen Wert enthielt, enthält es weiterhin einen Wert und umgekehrt. Der Inhalt von value und die enthaltenen Werte von * this und other hängen von den Ausnahmesicherheitsgarantien der Operation ab, von der die Ausnahme stammt (Copy-Konstruktor, Move-Zuweisung, etc.).
3) Hat folgende

Hinweise

Ein optionales Objekt op kann mit beiden Ausdrücken in ein leeres Optional umgewandelt werden: op = { } ; und op = nullopt ; . Der erste Ausdruck konstruiert ein leeres optional -Objekt mit { } und weist es op zu.

Feature-Test Makro Wert Std Feature
__cpp_lib_optional 202106L (C++20)
(DR20)
Vollständig constexpr ( 1 ) , ( 4-6 )

Beispiel

#include <iostream>
#include <optional>
int main()
{
    std::optional<const char*> s1 = "abc", s2; // Konstruktor
    s2 = s1; // Zuweisung
    s1 = "def"; // Zerfallende Zuweisung (U = char[4], T = const char*)
    std::cout << *s2 << ' ' << *s1 << '\n';
}

Ausgabe:

abc def

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++17 das Standard-Template-Argument von Überladung ( 6 ) war T geändert zu std:: remove_cv_t < T >
P0602R4 C++17 Kopier-/Verschiebezuweisungsoperator könnte nicht trivial sein
selbst wenn zugrundeliegende Operationen trivial sind
muss Trivialität propagieren
P2231R1 C++20 Überladungen ( 1,4-6 ) waren nicht constexpr gemacht constexpr

Siehe auch

Konstruiert den enthaltenen Wert direkt
(öffentliche Member-Funktion)