std::unique_ptr<T,Deleter>:: operator=
From cppreference.net
<
cpp
|
memory
|
unique ptr
|
unique_ptr
&
operator
=
(
unique_ptr
&&
r
)
noexcept
;
|
(1) | (constexpr начиная с C++23) |
|
template
<
class
U,
class
E
>
unique_ptr & operator = ( unique_ptr < U, E > && r ) noexcept ; |
(2) | (constexpr начиная с C++23) |
|
unique_ptr
&
operator
=
(
std::
nullptr_t
)
noexcept
;
|
(3) | (constexpr начиная с C++23) |
|
unique_ptr
&
operator
=
(
const
unique_ptr
&
)
=
delete
;
|
(4) | |
1)
Оператор перемещающего присваивания. Передает владение от
r
к
*
this
, как если бы был вызван
reset
(
r.
release
(
)
)
с последующим присваиванием
get_deleter()
из
std::
forward
<
Deleter
>
(
r.
get_deleter
(
)
)
.
Эта перегрузка участвует в разрешении перегрузки только если
std::
is_move_assignable
<
Deleter
>
::
value
равно
true
.
Если
Deleter
не является ссылочным типом, поведение не определено, если
-
Deleterне является MoveAssignable , или -
присваивание
get_deleter()
из
rvalue
типа
Deleterвызовет исключение.
В противном случае (
Deleter
является ссылочным типом), поведение не определено, если
-
std::remove_reference<Deleter>::typeне является CopyAssignable , или -
присваивание
get_deleter()
из
lvalue
типа
Deleterвыбросит исключение.
2)
Преобразующий оператор присваивания. Передает владение от
r
к
*
this
как если бы вызывался
reset
(
r.
release
(
)
)
с последующим присваиванием
get_deleter()
из
std::
forward
<
E
>
(
r.
get_deleter
(
)
)
.
Эта перегрузка участвует в разрешении перегрузки только при выполнении всех следующих условий:
- std:: is_assignable < Deleter & , E && > :: value равно true .
-
Для основной шаблонной специализации выполняются все следующие условия:
-
Uне является типом массива. -
unique_ptr<U, E>::pointerнеявно преобразуется вpointer, и.
-
-
Для специализации для массивов (
unique_ptr<T[]>) выполняются все следующие условия:-
Uявляется типом массива. -
pointerимеет тот же тип, что иelement_type*. -
unique_ptr<U, E>::pointerимеет тот же тип, что иunique_ptr<U, E>::element_type*. -
unique_ptr<U, E>::element_type(*)[]преобразуется вelement_type(*)[].
-
Если
E
не является ссылочным типом, поведение не определено, если присваивание
get_deleter()
из
rvalue
типа
E
некорректно или может вызвать исключение.
В противном случае (
E
является ссылочным типом), поведение не определено, если присваивание
get_deleter()
из
lvalue
типа
E
некорректно или может вызвать исключение.
3)
Фактически эквивалентно вызову
reset()
.
4)
Оператор копирующего присваивания явно удален.
Содержание |
Параметры
| r | - | умный указатель, из которого будет передано владение |
Возвращаемое значение
* this
Примечания
Как тип только с перемещением,
unique_ptr
оператор присваивания принимает только
rvalue
аргументы (например, результат
std::make_unique
или переменную
unique_ptr
, к которой применен
std::move
).
Пример
Запустить этот код
#include <iostream> #include <memory> struct Foo { int id; Foo(int id) : id(id) { std::cout << "Foo " << id << '\n'; } ~Foo() { std::cout << "~Foo " << id << '\n'; } }; int main() { std::unique_ptr<Foo> p1(std::make_unique<Foo>(1)); { std::cout << "Creating new Foo...\n"; std::unique_ptr<Foo> p2(std::make_unique<Foo>(2)); // p1 = p2; // Error ! can't copy unique_ptr p1 = std::move(p2); std::cout << "About to leave inner block...\n"; // Foo instance will continue to live, // despite p2 going out of scope } std::cout << "About to leave program...\n"; }
Вывод:
Foo 1 Creating new Foo... Foo 2 ~Foo 1 About to leave inner block... About to leave program... ~Foo 2
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Исправленное поведение |
|---|---|---|---|
| LWG 2047 | C++11 |
для перегрузки
(2)
,
get_deleter()
присваивалось из
std:: forward < Deleter > ( r. get_deleter ( ) ) |
исправлено на
std:: forward < E > ( r. get_deleter ( ) ) |
| LWG 2118 | C++11 |
unique_ptr<T[]>::operator=
отклонял квалификационные преобразования |
принимает |
|
LWG 2228
( N4366 ) |
C++11 |
оператор преобразующего присваивания
не имел ограничения на присваиваемость |
добавлено ограничение |
| LWG 2246 | C++11 |
цель присваивания преобразованного
удалителя r не была указана |
указано как get_deleter() |
| LWG 2899 | C++11 | оператор перемещающего присваивания не был ограничен | ограничен |