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) (начиная с C++26)
constexpr indirect & operator = ( indirect && other ) noexcept ( /* см. ниже */ ) ;
(2) (начиная с C++26)
template < class U = T >
constexpr indirect & operator = ( U && value ) ;
(3) (начиная с C++26)

Заменяет содержимое * this на value или содержимое other .

Пусть traits будет std:: allocator_traits < Allocator > :

1) Если std:: addressof ( other ) == this равно true , ничего не делает. Иначе, пусть need_update будет traits :: propagate_on_container_copy_assignment :: value :
  • Если other не содержит значения, * this становится не содержащим значения и объект, принадлежащий * this (если есть), уничтожается с использованием traits :: destroy , после чего память освобождается.
  • Иначе, если alloc == other. alloc равно true и * this не является не содержащим значения, эквивалентно ** this = * other .
  • Иначе:
  1. Создает новый принадлежащий объект в * this с использованием traits :: construct с * other в качестве аргумента, используя аллокатор update_alloc ? other. alloc : alloc .
  2. Предыдущий принадлежащий объект в * this (если есть) уничтожается с использованием traits :: destroy , после чего память освобождается.
  3. p указывает на новый принадлежащий объект.
После обновления объекта, принадлежащего * this , если need_update имеет значение true , alloc заменяется копией other. alloc .
Если std:: is_copy_assignable_v < T > && std:: is_copy_constructible_v < T > равно false , программа является некорректной.
2) Если std:: addressof ( other ) == this равно true , ничего не делает. В противном случае, пусть need_update будет traits :: propagate_on_container_move_assignment :: value :
  • Если other не содержит значения, * this становится не содержащим значения, и объект, принадлежащий * this (если есть), уничтожается с использованием traits :: destroy , после чего память освобождается.
  • Иначе, если alloc == other. alloc равно true , обменивает принадлежащие объекты в * this и other ; принадлежащий объект в other (если есть) затем уничтожается с использованием traits :: destroy , после чего память освобождается.
  • Иначе:
  1. Создает новый принадлежащий объект в * this с использованием traits :: construct с аргументом std :: move ( * other ) , используя аллокатор update_alloc ? other. alloc : alloc .
  2. Предыдущий принадлежащий объект в * this (если есть) уничтожается с использованием traits :: destroy , после чего память освобождается.
  3. p указывает на новый принадлежащий объект.
После обновления объектов, принадлежащих * this и other , если need_update равно true , alloc заменяется копией other. alloc .
Если std:: is_copy_constructible_v < T > равно false , программа является некорректной.
3) Если * this не содержит значения, то конструирует содержащийся объект с помощью std:: forward < U > ( value ) используя alloc . Иначе эквивалентно ** this = std:: forward < U > ( value ) .
Эта перегрузка участвует в разрешении перегрузки только при выполнении всех следующих условий:

Содержание

Параметры

other - другой indirect объект, чьё управляемое значение (если существует) используется для присваивания
value - значение для присваивания или конструирования управляемого значения

Возвращаемое значение

* this

Исключения

1) Если выбрасывается любое исключение, результат this - > valueless_after_move ( ) остается неизменным.
Если во время вызова выбранного конструктора копирования T возникает исключение, эффекта нет.
Если во время вызова оператора присваивания копированием для T возникает исключение, состояние this - > p определяется гарантиями безопасности исключений оператора присваивания копированием для T .
2) Если возникает любое исключение, это не оказывает никакого влияния на * this или other .
noexcept спецификация:
noexcept ( std:: allocator_traits < Allocator > ::

propagate_on_container_move_assignment :: value

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

Пример