std::unique_ptr<T,Deleter>:: operator=
From cppreference.net
<
cpp
|
memory
|
unique ptr
|
unique_ptr
&
operator
=
(
unique_ptr
&&
r
)
noexcept
;
|
(1) | (C++23부터 constexpr) |
|
template
<
class
U,
class
E
>
unique_ptr & operator = ( unique_ptr < U, E > && r ) noexcept ; |
(2) | (C++23부터 constexpr) |
|
unique_ptr
&
operator
=
(
std::
nullptr_t
)
noexcept
;
|
(3) | (C++23부터 constexpr) |
|
unique_ptr
&
operator
=
(
const
unique_ptr
&
)
=
delete
;
|
(4) | |
1)
이동 할당 연산자.
r
로부터의 소유권을
*
this
로 이전합니다. 마치
reset
(
r.
release
(
)
)
를 호출한 후
get_deleter()
에
std::
forward
<
Deleter
>
(
r.
get_deleter
(
)
)
를 할당하는 것처럼 동작합니다.
만약
Deleter
가 참조 타입이 아니라면, 다음의 경우에 동작은 정의되지 않습니다:
-
Deleter가 MoveAssignable 가 아닌 경우, 또는 -
get_deleter()
에
Deleter타입의 rvalue 를 할당할 때 예외가 발생하는 경우.
그렇지 않은 경우 (
Deleter
가 참조 타입인 경우), 다음 중 하나라도 해당되면 동작은 정의되지 않습니다:
-
std::remove_reference<Deleter>::type가 CopyAssignable 가 아닌 경우, 또는 -
get_deleter()
에
Deleter타입의 lvalue 를 할당할 때 예외가 발생하는 경우.
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
가 참조 타입인 경우),
E
타입의
lvalue
로부터
get_deleter()
를 할당하는 것이 잘못된 형식이거나 예외를 발생시키는 경우 동작은 정의되지 않습니다.
3)
reset()
를 호출하는 것과 실질적으로 동일합니다.
4)
복사 할당 연산자가 명시적으로 삭제되었습니다.
목차 |
매개변수
| r | - | 소유권이 이전될 smart pointer |
반환값
* this
참고 사항
이동 전용 타입으로서,
unique_ptr
의 할당 연산자는 오직
rvalues
인수만을 받습니다 (예:
std::make_unique
의 결과값이나
std::move
가 적용된
unique_ptr
변수).
예제
이 코드 실행
#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=
qualification 변환을 거부함 |
허용함 |
|
LWG 2228
( N4366 ) |
C++11 |
변환 할당 연산자가
할당 가능성 제약 조건이 누락됨 |
제약 조건이 추가됨 |
| LWG 2246 | C++11 |
변환된
deleter의 할당 대상이 r 에 대해 명시되지 않음 |
다음으로 명시됨 get_deleter() |
| LWG 2899 | C++11 | 이동 할당 연산자가 제약되지 않음 | 제약됨 |