Namespaces
Variants

std::indirect<T, Allocator>:: operator=

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
constexpr indirect & operator = ( const indirect & other ) ;
(1) (depuis C++26)
constexpr indirect & operator = ( indirect && other ) noexcept ( /* voir ci-dessous */ ) ;
(2) (depuis C++26)
template < class U = T >
constexpr indirect & operator = ( U && value ) ;
(3) (depuis C++26)

Remplace le contenu de * this par value ou par le contenu de other .

Soit traits égal à std:: allocator_traits < Allocator > :

1) Si std:: addressof ( other ) == this est true , ne fait rien. Sinon, soit need_update égal à traits :: propagate_on_container_copy_assignment :: value :
  • Si other est sans valeur, * this devient sans valeur et l'objet détenu par * this (s'il existe) est détruit en utilisant traits :: destroy puis le stockage est désalloué.
  • Sinon, si alloc == other. alloc est true et * this n'est pas sans valeur, équivalent à ** this = * other .
  • Sinon :
  1. Construit un nouvel objet détenu dans * this en utilisant traits :: construct avec * other comme argument, en utilisant l'allocateur update_alloc ? other. alloc : alloc .
  2. L'objet précédemment détenu dans * this (s'il existe) est détruit en utilisant traits :: destroy puis le stockage est désalloué.
  3. p pointe vers le nouvel objet détenu.
Après la mise à jour de l'objet détenu par * this , si need_update est true , alloc est remplacé par une copie de other. alloc .
Si std:: is_copy_assignable_v < T > && std:: is_copy_constructible_v < T > est false , le programme est mal formé.
2) Si std:: addressof ( other ) == this est true , ne fait rien. Sinon, soit need_update égal à traits :: propagate_on_container_move_assignment :: value :
  • Si other est sans valeur, * this devient sans valeur et l'objet détenu par * this (s'il existe) est détruit en utilisant traits :: destroy puis le stockage est désalloué.
  • Sinon, si alloc == other. alloc est true , échange les objets détenus dans * this et other ; l'objet détenu dans other (s'il existe) est ensuite détruit en utilisant traits :: destroy puis le stockage est désalloué.
  • Sinon :
  1. Construit un nouvel objet détenu dans * this en utilisant traits :: construct avec std :: move ( * other ) comme argument, en utilisant l'allocateur update_alloc ? other. alloc : alloc .
  2. L'objet précédemment détenu dans * this (s'il existe) est détruit en utilisant traits :: destroy puis le stockage est désalloué.
  3. p pointe vers le nouvel objet détenu.
Après la mise à jour des objets détenus par * this et other , si need_update est true , alloc est remplacé par une copie de other. alloc .
Si std:: is_copy_constructible_v < T > est false , le programme est mal formé.
3) Si * this est sans valeur, alors construit un objet possédé avec std:: forward < U > ( value ) en utilisant alloc . Sinon, équivalent à ** this = std:: forward < U > ( value ) .
Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

Table des matières

Paramètres

autre - un autre indirect objet dont la valeur possédée (si elle existe) est utilisée pour l'affectation
valeur - valeur à affecter ou à construire pour la valeur possédée

Valeur de retour

* this

Exceptions

1) Si une exception est levée, le résultat de this - > valueless_after_move ( ) reste inchangé.
Si une exception est levée durant l'appel au constructeur par copie sélectionné de T , aucun effet.
Si une exception est levée durant l'appel à l'opérateur d'affectation par copie de T , l'état de this - > p est défini par la garantie de sûreté face aux exceptions de l'opérateur d'affectation par copie de T .
2) Si une exception est levée, il n'y a aucun effet sur * this ou other .
noexcept spécification :
noexcept ( std:: allocator_traits < Allocator > ::

propagate_on_container_move_assignment :: value

|| std:: allocator_traits < Allocator > :: is_always_equal :: value )

Exemple