std::optional<T>::operator=
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.
*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.other zu.
- Wenn sowohl
*thisals auchotherkeinen Wert enthalten, hat die Funktion keine Wirkung. - Wenn
*thiseinen Wert enthält,otherjedoch nicht, wird der enthaltene Wert durch Aufruf seines Destruktors zerstört.*thisenthält nach dem Aufruf keinen Wert. - Wenn
othereinen Wert enthält, dann wird, abhängig davon, ob*thiseinen Wert enthält, der enthaltene Wert entweder direktinitialisiert oder von*other(2) oderstd::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>oderstd::is_copy_assignable_v<T>falseist. Sie ist trivial, wennstd::is_trivially_copy_constructible_v<T>,std::is_trivially_copy_assignable_v<T>undstd::is_trivially_destructible_v<T>alletruesind. - Überladung (3) nimmt nicht an der Überladungsauflösung teil, wenn entweder
std::is_move_constructible_v<T>oderstd::is_move_assignable_v<T>falseist. Sie ist trivial, wennstd::is_trivially_move_constructible_v<T>,std::is_trivially_move_assignable_v<T>undstd::is_trivially_destructible_v<T>alletruesind.
*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:
Tist kein Skalartyp;std::decay_t<U>ist nichtT.
other zu.
- Wenn sowohl
*thisals auchotherkeinen Wert enthalten, hat die Funktion keine Wirkung. - Wenn
*thiseinen Wert enthält,otherjedoch nicht, wird der enthaltene Wert durch Aufruf seines Destruktors zerstört.*thisenthält nach dem Aufruf keinen Wert. - Wenn
othereinen Wert enthält, dann wird, abhängig davon, ob*thiseinen Wert enthält, der enthaltene Wert entweder direktinitialisiert oder von*other(5) oderstd::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:
Tist nicht konstruierbar, konvertierbar oder zuweisbar von einem Ausdruck vom Typ (möglicherweiseconst)std::optional<U>, d.h., die folgenden 12 Typeigenschaften sind allefalse: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&>undstd::is_assignable_v<T&, const U&>beidetrue. - Für Überladung (6) sind
std::is_constructible_v<T, U>undstd::is_assignable_v<T&, U>beidetrue.
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
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.).
std:: is_nothrow_move_constructible_v < T > )
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) |