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) (desde C++26)
constexpr indirect & operator = ( indirect && other ) noexcept ( /* ver más abajo */ ) ;
(2) (desde C++26)
template < class U = T >
constexpr indirect & operator = ( U && value ) ;
(3) (desde C++26)

Reemplaza el contenido de * this con value o el contenido de other .

Sea traits como std:: allocator_traits < Allocator > :

1) Si std:: addressof ( other ) == this es true , no hace nada. De lo contrario, sea need_update igual a traits :: propagate_on_container_copy_assignment :: value :
  • Si other no tiene valor, * this se convierte en sin valor y el objeto poseído por * this (si existe) se destruye usando traits :: destroy y luego se desasigna el almacenamiento.
  • De lo contrario, si alloc == other. alloc es true y * this no está sin valor, equivalente a ** this = * other .
  • De lo contrario:
  1. Construye un nuevo objeto poseído en * this usando traits :: construct con * other como argumento, usando el asignador update_alloc ? other. alloc : alloc .
  2. El objeto previamente poseído en * this (si existe) se destruye usando traits :: destroy y luego se desasigna el almacenamiento.
  3. p apunta al nuevo objeto poseído.
Después de actualizar el objeto poseído por * this , si need_update es true , alloc se reemplaza con una copia de other. alloc .
Si std:: is_copy_assignable_v < T > && std:: is_copy_constructible_v < T > es false , el programa está mal formado.
2) Si std:: addressof ( other ) == this es true , no hace nada. De lo contrario, sea need_update igual a traits :: propagate_on_container_move_assignment :: value :
  • Si other no tiene valor, * this se convierte en sin valor y el objeto poseído por * this (si existe) se destruye usando traits :: destroy y luego se desasigna el almacenamiento.
  • De lo contrario, si alloc == other. alloc es true , intercambia los objetos poseídos en * this y other ; el objeto poseído en other (si existe) se destruye usando traits :: destroy y luego se desasigna el almacenamiento.
  • De lo contrario:
  1. Construye un nuevo objeto poseído en * this usando traits :: construct con std :: move ( * other ) como argumento, usando el asignador update_alloc ? other. alloc : alloc .
  2. El objeto previamente poseído en * this (si existe) se destruye usando traits :: destroy y luego se desasigna el almacenamiento.
  3. p apunta al nuevo objeto poseído.
Después de actualizar los objetos propiedad de * this y other , si need_update es true , alloc se reemplaza con una copia de other. alloc .
Si std:: is_copy_constructible_v < T > es false , el programa está mal formado.
3) Si * this no tiene valor, entonces construye un objeto poseído con std:: forward < U > ( value ) usando alloc . De lo contrario, equivalente a ** this = std:: forward < U > ( value ) .
Esta sobrecarga participa en la resolución de sobrecarga solo si se cumplen todas las siguientes condiciones:

Contenidos

Parámetros

otro - otro objeto indirect cuyo valor poseído (si existe) se utiliza para la asignación
valor - valor para asignar o construir el valor poseído

Valor de retorno

* this

Excepciones

1) Si se lanza alguna excepción, el resultado de this - > valueless_after_move ( ) permanece sin cambios.
Si se lanza una excepción durante la llamada al constructor de copia seleccionado de T , no tiene efecto.
Si se lanza una excepción durante la llamada al operador de asignación de copia de T , el estado de this - > p está definido por la garantía de seguridad de excepciones del operador de asignación de copia de T .
2) Si se lanza alguna excepción, no hay efectos sobre * this o other .
noexcept especificación:
noexcept ( std:: allocator_traits < Allocator > ::

propagate_on_container_move_assignment :: value

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

Ejemplo