Namespaces
Variants

std::experimental::ranges:: Assignable

From cppreference.net
Défini dans l'en-tête <experimental/ranges/concepts>
template < class T, class U >

concept bool Assignable =
std:: is_lvalue_reference < T > :: value &&
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
requires ( T t, U && u ) {
{ t = std:: forward < U > ( u ) } - > Same < T > && ;

} ;
(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 objet o ,
  • u , une expression telle que decltype ( ( u ) ) est U ,
  • 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 :
    • t est égal à u2 , sauf si u est une xvalue non constante qui réfère à o (c'est-à-dire que l'assignation est une auto-affectation par déplacement),
    • si u est 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 > ).