std::expected<T,E>:: operator=
|
Modèle primaire
|
||
|
constexpr
expected
&
operator
=
(
const
expected
&
other
)
;
|
(1) | (depuis C++23) |
|
constexpr
expected
&
operator
=
(
expected
&&
other
)
noexcept ( /* voir ci-dessous */ ) ; |
(2) | (depuis C++23) |
|
template
<
class
U
=
std::
remove_cv_t
<
T
>
>
constexpr expected & operator = ( U && v ) ; |
(3) | (depuis C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( const std:: unexpected < G > & e ) ; |
(4) | (depuis C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( std:: unexpected < G > && e ) ; |
(5) | (depuis C++23) |
|
void
spécialisation partielle
|
||
|
constexpr
expected
&
operator
=
(
const
expected
&
other
)
;
|
(6) | (depuis C++23) |
|
constexpr
expected
&
operator
=
(
expected
&&
other
)
noexcept ( /* voir ci-dessous */ ) ; |
(7) | (depuis C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( const std:: unexpected < G > & e ) ; |
(8) | (depuis C++23) |
|
template
<
class
G
>
constexpr expected & operator = ( std:: unexpected < G > && e ) ; |
(9) | (depuis C++23) |
|
Modèle de fonction d'assistance
|
||
|
template
<
class
T,
class
U,
class
...
Args
>
constexpr void /*reinit-expected*/ ( T & newval, U & oldval, Args && ... args ) |
(10) |
(depuis C++23)
( exposition uniquement* ) |
Attribue une nouvelle valeur à un objet
expected
existant.
Table des matières |
Paramètres
| other | - |
autre objet
expected
dont la valeur contenue doit être assignée
|
| v | - | valeur à assigner à la valeur contenue |
| e | - | std::unexpected objet dont la valeur contenue doit être assignée |
| newval | - | la valeur contenue à construire |
| oldval | - | la valeur contenue à détruire |
| args | - | les arguments utilisés comme initialiseurs de newval |
Effets
Opérateurs d'affectation du modèle principal
has_value()
et
rhs.
has_value
(
)
ont des valeurs différentes (c'est-à-dire que l'un de
*
this
et
other
contient une valeur attendue
val
et l'autre contient une valeur inattendue
unex
), le modèle de fonction exposition-only
reinit-expected
est appelé pour mettre à jour l'état de manière sécurisée.
Valeur de
has_value()
|
Valeur de other. has_value ( ) | |
|---|---|---|
| true | false | |
| true |
val
=
*
other
;
|
reinit-expected
(
unex
,
val
, other.
error
(
)
)
;
|
| false |
reinit-expected
(
val
,
unex
,
*
other
)
;
|
unex
=
other.
error
(
)
;
|
Valeur de
has_value()
|
Valeur de 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
(
)
;
.
Valeur de
has_value()
|
Équivalent à |
|---|---|
| true |
val
=
std::
forward
<
U
>
(
v
)
;
|
| false |
reinit-expected
(
val
,
unex
,
std::
forward
<
U
>
(
v
)
)
;
has_val
=
false
;
|
| Surcharge |
Valeur de
has_value()
|
Équivalent à |
|---|---|---|
| ( 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 opérateurs d'affectation de spécialisation partielle
Valeur de
has_value()
|
Valeur de other. has_value ( ) | |
|---|---|---|
| true | false | |
| true | (aucun effet) |
std::
construct_at
(
std::
addressof
(
unex
)
, rhs.
unex
)
;
has_val
=
false
;
|
| false |
std::
destroy_at
(
std::
addressof
(
unex
)
)
;
has_val
=
true
;
|
unex
=
other.
error
(
)
;
|
Valeur de
has_value()
|
Valeur de other. has_value ( ) | |
|---|---|---|
| true | false | |
| true | (aucun effet) |
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
(
)
)
;
|
| Surcharge |
Valeur de
has_value()
|
Équivalent à |
|---|---|---|
| ( 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
(
)
)
;
|
Modèle de fonction d'assistance
Le modèle de fonction d'exposition uniquement
reinit-expected
est « défini » comme suit :
template<class NewType, class OldType, class... Args> constexpr void reinit-expected(NewType& new_val, OldType& old_val, Args&&... args) { // Cas 1 : la construction de « new_val » est non-lançante : // « new_val » peut être construit directement après la destruction de « old_val » 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)...); } // Cas 2 : la construction par déplacement de « new_val » est non-lançante : // construire d'abord un objet temporaire NewType // (« old_val » reste intact si une exception est lancée lors de cette construction) else if constexpr (std::is_nothrow_move_constructible_v<NewType>) { NewType temp(std::forward<Args>(args)...); // peut lancer std::destroy_at(std::addressof(old_val)); std::construct_at(std::addressof(new_val), std::move(temp)); } // Cas 3 : la construction de « new_val » est potentiellement lançante : // une sauvegarde de « old_val » est nécessaire pour récupérer après une exception else { OldType temp(std::move(old_val)); // peut lancer std::destroy_at(std::addressof(old_val)); try { std::construct_at(std::addressof(new_val), std::forward<Args>(args)...); // peut lancer } catch (...) { std::construct_at(std::addressof(old_val), std::move(temp)); throw; } } }
Ce modèle de fonction est appelé lorsque l'affectation va faire en sorte que * this contienne la valeur alternative (c'est-à-dire d'une valeur attendue à une valeur inattendue, ou d'une valeur inattendue à une valeur attendue).
Dans ce cas, l'ancienne valeur oldval doit être détruite avant de construire la nouvelle valeur newval . Cependant, la construction de newval peut lever une exception. Afin de fournir la garantie de sécurité d'exception forte , l'ancienne valeur doit être restaurée avant de relancer l'exception afin que * this ait un état valide pendant le traitement de l'exception.
Valeur de retour
Contraintes et informations supplémentaires
Opérateurs d'affectation du modèle principal
- std:: is_same_v < expected, std:: remove_cvref_t < U >> est false .
-
std::
remove_cvref_t
<
U
>
n'est pas une spécialisation de
std::unexpected. -
Toutes les valeurs suivantes sont
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 opérateurs d'affectation de spécialisation partielle
Exceptions
std::
is_nothrow_move_constructible_v
<
T
>
&&
std::
is_nothrow_move_assignable_v
<
T
>
&&
Exemple
|
Cette section est incomplète
Raison : aucun exemple |
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 3886 | C++23 |
l'argument template par défaut de la surcharge
(
3
)
était
T
|
modifié en std:: remove_cv_t < T > |
| LWG 4025 | C++23 |
la surcharge
(
7
)
était définie comme supprimée si
E
n'est
pas constructible par déplacement ou pas assignable par déplacement |
elle ne participe pas à la
résolution de surcharge dans ce cas |
Voir aussi
|
construit la valeur attendue en place
(fonction membre publique) |