std::expected<T,E>:: operator=
|
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
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.
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
(
)
;
|
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
(
)
)
;
|
has_val
=
other.
has_value
(
)
;
aus.
Wert von
has_value()
|
Entspricht |
|---|---|
| true |
val
=
std::
forward
<
U
>
(
v
)
;
|
| false |
reinit-expected
(
val
,
unex
,
std::
forward
<
U
>
(
v
)
)
;
has_val
=
false
;
|
| Ü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
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
(
)
;
|
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
(
)
)
;
|
| Ü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
Einschränkungen und ergänzende Informationen
Primäre Template-Zuweisungsoperatoren
- std:: is_same_v < expected, std:: remove_cvref_t < U >> ist false .
-
std::
remove_cvref_t
<
U
>
ist keine Spezialisierung von
std::unexpected. -
Alle folgenden Werte sind
true
:
- std:: is_constructible_v < T, U >
- std:: is_assignable_v < T & , U >
-
std::
is_nothrow_constructible_v
<
T, U
>
||
std::
is_nothrow_move_constructible_v
<
T
>
||
std:: is_nothrow_move_constructible_v < E >
- std:: is_constructible_v < E, const G & >
- std:: is_assignable_v < E & , const G & >
-
std::
is_nothrow_constructible_v
<
E,
const
G
&
>
||
std::
is_nothrow_move_constructible_v
<
T
>
||
std:: is_nothrow_move_constructible_v < E >
- std:: is_constructible_v < E, G >
- std:: is_assignable_v < E & , G >
-
std::
is_nothrow_constructible_v
<
E, G
>
||
std::
is_nothrow_move_constructible_v
<
T
>
||
std:: is_nothrow_move_constructible_v < E >
void Partielle Spezialisierungs-Zuweisungsoperatoren
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) |