Spec-Zone.ru › C++

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>:

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).
Эта перегрузка участвует в разрешении перегрузки, только если выполнены все следующие условия:
  • 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

Spec-Zone.ru

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