std::indirect<T, Allocator>::operator=
constexpr indirect& operator=( const indirect& other ); | (1) | (начиная с C++26) |
constexpr indirect& operator=( indirect&& other ) noexcept(/* see below */); | (2) | (начиная с C++26) |
template< class U = T > constexpr indirect& operator=( U&& value ); | (3) | (начиная с C++26) |
Заменяет содержимое *this на value или содержимое other.
Пусть traits — это std::allocator_traits<Allocator>:
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. - В противном случае:
- Создаёт новый объект во владении в
*thisс помощью traits::construct, передавая*otherв качестве аргумента и используя аллокаторupdate_alloc?other.alloc : alloc. - Объект, ранее находившийся во владении
*this(если он есть), уничтожается с помощью traits::destroy, после чего хранилище освобождается. -
pуказывает на новый объект во владении.
После обновления объекта, находящегося во владении
*this, если need_update — это true, alloc заменяется копией other.alloc.
Если
2) Если std::is_copy_assignable_v<T> && std::is_copy_constructible_v<T> — это false, программа некорректна.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, после чего хранилище освобождается. - В противном случае:
- Создаёт новый объект во владении в
*thisс помощью traits::construct, передаваяstd::move(*other)в качестве аргумента и используя аллокаторupdate_alloc?other.alloc : alloc. - Объект, ранее находившийся во владении
*this(если он есть), уничтожается с помощью traits::destroy, после чего хранилище освобождается. -
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).-
std::is_same_v<std::remove_cvref_t<U>, std::indirect>— этоfalse. -
std::is_constructible_v<T, U>— этоtrue. -
std::is_assignable_v<T&, U>— этоtrue.
Параметры
| 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)
Пример
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/indirect/operator%3D