std::experimental::ranges:: Assignable
|
Défini dans l'en-tête
<experimental/ranges/concepts>
|
||
|
template
<
class
T,
class
U
>
concept
bool
Assignable
=
|
(ranges TS) | |
Le concept
Assignable<T, U>
spécifie qu'une expression du type et de la catégorie de valeur spécifiés par
U
peut être assignée à une expression lvalue dont le type est spécifié par
T
.
Étant donné
-
t, une lvalue de type std:: remove_reference_t < T > qui fait référence à un objeto, -
u, une expression telle que decltype ( ( u ) ) estU, -
u2, un objet distinct qui est égal àu,
Assignable<T, U>
est satisfait seulement si
- std:: addressof ( t = u ) == std:: addressof ( o ) (c'est-à-dire que l'expression d'assignation produit une lvalue référençant l'opérande gauche) ;
-
Après l'évaluation de
t
=
u
:
-
test égal àu2, sauf siuest une xvalue non constante qui réfère ào(c'est-à-dire que l'assignation est une auto-affectation par déplacement), -
si
uest une glvalue :- Si c'est une xvalue non constante, l'objet auquel elle réfère est dans un état valide mais non spécifié ;
- Sinon, l'objet auquel elle réfère n'est pas modifié ;
-
Il n'est pas nécessaire qu'il existe une relation de subsomption entre
Assignable<T, U>
et
std::
is_lvalue_reference
<
T
>
::
value
.
Préservation de l'égalité
Une expression est préservatrice d'égalité si elle produit des résultats égaux pour des entrées égales.
- Les entrées d'une expression consistent en ses opérandes.
- Les sorties d'une expression consistent en son résultat et tous les opérandes modifiés par l'expression (le cas échéant).
Toute expression devant préserver l'égalité doit en outre être stable : deux évaluations d'une telle expression avec les mêmes objets d'entrée doivent produire des sorties égales en l'absence de toute modification explicite intervenant entre-temps sur ces objets d'entrée.
Sauf indication contraire, toute expression utilisée dans une requires-expression doit être égalité-préservante et stable, et l'évaluation de l'expression ne peut modifier que ses opérandes non constants. Les opérandes constants ne doivent pas être modifiés.
Notes
Une contrainte de déduction de la forme
{
expression
}
-
>
Same
<
T
>
&&
exige effectivement que
decltype
(
(
expression
)
)
&&
soit exactement le même type que
T&&
. Cela contraint à la fois le type de l'expression et sa catégorie de valeur.
L'assignation n'a pas besoin d'être une fonction totale. En particulier, si l'assignation à un objet
x
peut entraîner la modification d'un autre objet
y
, alors
x
=
y
n'appartient probablement pas au domaine de
=
. Cela se produit typiquement lorsque l'opérande droit est possédé directement ou indirectement par l'opérande gauche (par exemple, avec des pointeurs intelligents vers des nœuds dans une structure de données à base de nœuds, ou avec quelque chose comme
std::
vector
<
std::
any
>
).