Namespaces
Variants

std::polymorphic<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 polymorphic & operator = ( const polymorphic & other ) ;
(1) (с C++26)
constexpr polymorphic & operator = ( polymorphic && other )
noexcept ( /* см. ниже */ ) ;
(2) (с C++26)

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

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

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

Содержание

Параметры

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

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

* this

Исключения

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

propagate_on_container_move_assignment :: value

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

Пример