Spec-Zone.ru › C++

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

constexpr polymorphic& operator=( const polymorphic& other );
(1) (с C++26)
constexpr polymorphic& operator=( polymorphic&& other )
    noexcept(/* see below */);
(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)

Пример

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/polymorphic/operator%3D

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API