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) (seit C++26)
constexpr indirect & operator = ( indirect && other ) noexcept ( /* siehe unten */ ) ;
(2) (seit C++26)
template < class U = T >
constexpr indirect & operator = ( U && value ) ;
(3) (seit C++26)

Ersetzt den Inhalt von * this durch value oder den Inhalt von other .

Sei traits gleich std:: allocator_traits < Allocator > :

1) Wenn std:: addressof ( other ) == this true ist, tut nichts. Andernfalls sei need_update gleich traits :: propagate_on_container_copy_assignment :: value :
  • Wenn other wertlos ist, wird * this wertlos und das von * this gehaltene Objekt (falls vorhanden) wird mittels traits :: destroy zerstört und anschließend der Speicher freigegeben.
  • Andernfalls, wenn alloc == other. alloc true ist und * this nicht wertlos ist, entspricht dies ** this = * other .
  • Andernfalls:
  1. Konstruiert ein neues gehaltenes Objekt in * this mittels traits :: construct mit * other als Argument, unter Verwendung des Allokators update_alloc ? other. alloc : alloc .
  2. Das zuvor in * this gehaltene Objekt (falls vorhanden) wird mittels traits :: destroy zerstört und anschließend der Speicher freigegeben.
  3. p zeigt auf das neue gehaltene Objekt.
Nach dem Aktualisieren des Objekts, das im Besitz von * this ist, falls need_update gleich true ist, wird alloc durch eine Kopie von other. alloc ersetzt.
Wenn std:: is_copy_assignable_v < T > && std:: is_copy_constructible_v < T > false ist, ist das Programm fehlerhaft.
2) Wenn std:: addressof ( other ) == this true ist, tut nichts. Andernfalls sei need_update gleich traits :: propagate_on_container_move_assignment :: value :
  • Wenn other wertlos ist, wird * this wertlos und das von * this gehaltene Objekt (falls vorhanden) wird mittels traits :: destroy zerstört und anschließend der Speicher freigegeben.
  • Andernfalls, wenn alloc == other. alloc true ist, werden die gehaltenen Objekte in * this und other getauscht; das gehaltene Objekt in other (falls vorhanden) wird anschließend mittels traits :: destroy zerstört und der Speicher freigegeben.
  • Andernfalls:
  1. Konstruiert ein neues gehaltenes Objekt in * this mittels traits :: construct mit std :: move ( * other ) als Argument, unter Verwendung des Allokators update_alloc ? other. alloc : alloc .
  2. Das zuvor in * this gehaltene Objekt (falls vorhanden) wird mittels traits :: destroy zerstört und anschließend der Speicher freigegeben.
  3. p zeigt auf das neue gehaltene Objekt.
Nach dem Aktualisieren der Objekte, die im Besitz von * this und other sind, falls need_update den Wert true hat, wird alloc durch eine Kopie von other. alloc ersetzt.
Wenn std:: is_copy_constructible_v < T > false ist, ist das Programm fehlerhaft.
3) Wenn * this wertlos ist, dann konstruiert ein owned Objekt mit std:: forward < U > ( value ) unter Verwendung von alloc . Andernfalls äquivalent zu ** this = std:: forward < U > ( value ) .
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:

Inhaltsverzeichnis

Parameter

other - ein weiteres indirect Objekt, dessen besessener Wert (falls vorhanden) für die Zuweisung verwendet wird
value - Wert, der dem besessenen Wert zugewiesen oder für dessen Konstruktion verwendet wird

Rückgabewert

* this

Exceptions

1) Wenn eine Exception ausgelöst wird, bleibt das Ergebnis von this - > valueless_after_move ( ) unverändert.
Wenn während des Aufrufs des ausgewählten Kopierkonstruktors von T eine Exception ausgelöst wird, tritt keine Wirkung ein.
Wenn während des Aufrufs des Kopierzuweisungsoperators von T eine Exception ausgelöst wird, ist der Zustand von this - > p durch die Exception-Safety-Garantie des Kopierzuweisungsoperators von T definiert.
2) Wenn eine Ausnahme ausgelöst wird, gibt es keine Auswirkungen auf * this oder other .
noexcept Spezifikation:
noexcept ( std:: allocator_traits < Allocator > ::

propagate_on_container_move_assignment :: value

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

Beispiel