Namespaces
Variants

std::optional<T>::operator=

Von de.cppreference.net
 
 
Hilfsmittelbibliothek
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programmhilfsmittel
Funktionen mit variabler Argumentanzahl
Koroutinenunterstü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 (veraltet in C++20)
Integer-Vergleichsfunktionen
(C++20)(C++20)(C++20)    
(C++20)
Swap und Typoperationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Gängige Vokabeltypen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
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(/* see below */);
(3) (seit C++17)
template< class U = std::remove_cv_t<T> >
optional& operator=( U&& value );
(4) (seit C++17)
(constexpr seit C++20)
template< class U >
optional& operator=( const optional<U>& other );
(5) (seit C++17)
(constexpr seit C++20)
template< class U >
optional& operator=( optional<U>&& other );
(6) (seit C++17)
(constexpr seit C++20)

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

1) Wenn *this vor dem Aufruf einen Wert enthält, wird der enthaltene Wert durch Aufruf seines Destruktors zerstört, als ob durch value().T::~T(). *this enthält nach diesem Aufruf keinen Wert.
2,3) Weist den Zustand von other zu.
  • Wenn sowohl *this als auch other keinen Wert enthalten, hat die Funktion keine Wirkung.
  • Wenn *this einen Wert enthält, other jedoch nicht, wird der enthaltene Wert durch Aufruf seines Destruktors zerstört. *this enthält nach dem Aufruf keinen Wert.
  • Wenn other einen Wert enthält, dann wird, abhängig davon, ob *this einen Wert enthält, der enthaltene Wert entweder direktinitialisiert oder von *other (2) oder std::move(*other) (3) zugewiesen. Beachten Sie, dass ein verschobenes optional immer noch einen Wert enthält.
  • Überladung (2) wird gelöscht, wenn entweder std::is_copy_constructible_v<T> oder std::is_copy_assignable_v<T> false ist. Sie ist trivial, 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.
  • Überladung (3) nimmt nicht an der Überladungsauflösung teil, wenn entweder std::is_move_constructible_v<T> oder std::is_move_assignable_v<T> false ist. Sie ist trivial, 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.
4) Perfekt-weiterleitende Zuweisung: abhängig davon, ob *this vor dem Aufruf einen Wert enthält, wird der enthaltene Wert entweder direktinitialisiert von std::forward<U>(value) oder von std::forward<U>(value) zugewiesen. Die Funktion nimmt nicht an der Überladungsauflösung teil, es sei denn, std::decay_t<U>(bis C++20)std::remove_cvref_t<U>(seit C++20) ist nicht std::optional<T>, std::is_constructible_v<T, U> ist true, std::is_assignable_v<T&, U> ist true, und mindestens eine der folgenden Aussagen ist wahr:
  • T ist kein Skalartyp;
  • std::decay_t<U> ist nicht T.
5,6) Weist den Zustand von other zu.
  • Wenn sowohl *this als auch other keinen Wert enthalten, hat die Funktion keine Wirkung.
  • Wenn *this einen Wert enthält, other jedoch nicht, wird der enthaltene Wert durch Aufruf seines Destruktors zerstört. *this enthält nach dem Aufruf keinen Wert.
  • Wenn other einen Wert enthält, dann wird, abhängig davon, ob *this einen Wert enthält, der enthaltene Wert entweder direktinitialisiert oder von *other (5) oder std::move(*other) (6) zugewiesen. Beachten Sie, dass ein verschobenes optional immer noch einen Wert enthält.
  • Diese Überladungen nehmen nicht an der Überladungsauflösung teil, es sei denn, die folgenden Bedingungen sind erfüllt:
    • T ist nicht konstruierbar, konvertierbar oder zuweisbar von einem Ausdruck vom Typ (möglicherweise const) std::optional<U>, d.h., die folgenden 12 Typeigenschaften sind alle 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>&&>
    • Für Überladung (5) sind std::is_constructible_v<T, const U&> und std::is_assignable_v<T&, const U&> beide true.
    • Für Überladung (6) sind std::is_constructible_v<T, U> und std::is_assignable_v<T&, U> beide true.

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)