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: - Если
otherне содержит значения, переходит к следующему шагу. В противном случае создаёт новый принадлежащий объект в*thisс помощью traits::construct, передавая*otherв качестве аргумента и используя аллокаторupdate_alloc?other.alloc : alloc. - Ранее принадлежавший объект в
*this(если таковой имеется) уничтожается с помощью traits::destroy, после чего освобождается память.
После обновления объекта, принадлежащего
*this, если need_update — true, alloc заменяется копией other.alloc.
Если
2) Если T является неполным типом, программа некорректна.std::addressof(other) == this — true, ничего не делает. В противном случае пусть need_update будет traits::propagate_on_container_move_assignment::value: - Если
alloc ==other.alloc—true, меняет местами принадлежащие объекты в*thisиother; затем принадлежащий объект вother(если таковой имеется) уничтожается с помощью traits::destroy, после чего освобождается память. - В противном случае:
- Если
otherне содержит значения, переходит к следующему шагу. В противном случае создаёт новый принадлежащий объект в*thisс помощью traits::construct, передаваяstd::move(*other)в качестве аргумента и используя аллокаторupdate_alloc?other.alloc : alloc. - Ранее принадлежавший объект в
*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