std::expected<T,E>::operator=
constexpr expected& operator=( const expected& other );
|
(1) | (seit C++23) |
constexpr expected& operator=( expected&& other ) noexcept(/*see below*/);
|
(2) | (seit C++23) |
template< class U = std::remove_cv_t<T> >
constexpr expected& operator=( U&& v );
|
(3) | (seit C++23) (T ist nicht cv void) |
template< class G >
constexpr expected& operator=( const unexpected<G>& other );
|
(4) | (seit C++23) |
template< class G >
constexpr expected& operator=( unexpected<G>&& other );
|
(5) | (seit C++23) |
Weist einem vorhandenen expected-Objekt einen neuen Wert zu.
other zu.
- Wenn
this->has_value()gleichother.has_value()ist, wird der inotherenthaltene Wert zugewiesen. Tut nichts, wennT(möglicherweise cv-qualifiziert)voidist undother.has_value()trueist. - Andernfalls wird der aktuell enthaltene Wert zerstört (tut nichts, wenn
this->has_value()trueist undT(möglicherweise cv-qualifiziert)voidist), und*thiserhält eine Kopie des inotherenthaltenen Werts.
- Wenn
other.has_value()trueist undT(möglicherweise cv-qualifiziert)voidist, wird der neue Wert nicht konstruiert. Andernfalls wird der neue Wert kopierkonstruiert (1) oder verschiebungskonstruiert (2) von*otheroderother.error(), je nachdem. Wenn eine Ausnahme ausgelöst wird, bleibt der alte Wert erhalten;*thiswird nicht wertlos.
Wenn keine Ausnahme ausgelöst wurde, ist nach der Zuweisung has_value() gleich other.has_value().
- Überladung (1) ist als gelöscht definiert, sofern nicht
- entweder
T(möglicherweise cv-qualifiziert)voidist oderstd::is_copy_assignable_v<T>trueist, und - entweder
T(möglicherweise cv-qualifiziert)voidist oderstd::is_copy_constructible_v<T>trueist, und std::is_copy_assignable_v<E>trueist, undstd::is_copy_constructible_v<E>trueist, und- mindestens eine der folgenden Bedingungen
trueist:Tist (möglicherweise cv-qualifiziert)voidstd::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
- entweder
- Überladung (2) nimmt nur an der Überladungsauflösung teil, wenn
- entweder
T(möglicherweise cv-qualifiziert)voidist oderstd::is_move_assignable_v<T>trueist, und - entweder
T(möglicherweise cv-qualifiziert)voidist oderstd::is_move_constructible_v<T>trueist, und std::is_move_assignable_v<E>trueist, undstd::is_move_constructible_v<E>trueist, und- mindestens eine der folgenden Bedingungen
trueist:Tist (möglicherweise cv-qualifiziert)voidstd::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
- entweder
- Wenn
this->has_value()trueist, äquivalent zu**this = std::forward<U>(v). - Andernfalls zerstört den in
*thisenthaltenen Wert und lässt*thiseinen mitstd::forward<U>(v)initialisierten Wert enthalten. Wenn eine Ausnahme ausgelöst wird, bleibt der alte Wert erhalten;*thiswird nicht wertlos.
Wenn keine Ausnahme ausgelöst wurde, ist nach der Zuweisung this->has_value() true.
- Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn
std::is_same_v<expected, std::remove_cvref_t<U>>falseist, undstd::remove_cvref_t<U>keine Spezialisierung vonstd::unexpectedist, undstd::is_constructible_v<T, U>trueist, undstd::is_assignable_v<T&, U>trueist, und- mindestens eine der folgenden Bedingungen
trueist:std::is_nothrow_constructible_v<T, U>std::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
Sei GF const G& für Überladung (4) und G für Überladung (5).
- Wenn
this->has_value()trueist, zerstört den in*thisenthaltenen Wert (tut nichts, wennT(möglicherweise cv-qualifiziert)voidist) und lässt*thiseinen mitstd::forward<GF>(e.error())initialisierten Wert enthalten. Wenn eine Ausnahme ausgelöst wird, bleibt der alte Wert erhalten;*thiswird nicht wertlos. - Andernfalls äquivalent zu
this->error() = std::forward<GF>(e.error()).
Wenn keine Ausnahme ausgelöst wurde, ist nach der Zuweisung this->has_value() false.
- Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn
std::is_constructible_v<E, GF>trueist, undstd::is_assignable_v<E&, GF>trueist, und- mindestens eine der folgenden Bedingungen
trueist:Tist (möglicherweise cv-qualifiziert)voidstd::is_nothrow_constructible_v<E, GF>std::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
In allen Fällen, wenn T nicht (möglicherweise cv-qualifiziert) void ist, werden die Zerstörung des alten Werts und die Konstruktion des neuen Werts wie durch die folgende, nur zur Darstellung dienende Funktion reinit_expected durchgeführt.
template<class NewType, class OldType, class... Args>
constexpr void reinit_expected(NewType& new_val, OldType& old_val, Args&&... args)
{
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)...);
}
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));
}
else
{
OldType temp(std::move(old_val));
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;
}
}
}
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 |
Rückgabewert
Exceptions
std::
is_nothrow_move_constructible_v
<
T
>
&&
std::
is_nothrow_move_assignable_v
<
T
>
&&
Beispiel
|
Dieser Abschnitt ist unvollständig
Grund: Kein 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) |