Namespaces
Variants

std::unique_ptr<T,Deleter>:: operator=

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
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 ( ) ) 를 할당하는 것처럼 동작합니다.
이 오버로드는 std:: is_move_assignable < Deleter > :: value true 인 경우에만 오버로드 해결에 참여합니다.
만약 Deleter 가 참조 타입이 아니라면, 다음의 경우에 동작은 정의되지 않습니다:
그렇지 않은 경우 ( 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 가 참조 타입이 아닌 경우, E 타입의 rvalue 로부터 get_deleter() 를 할당하는 것이 잘못된 형식이거나 예외를 발생시키는 경우 동작은 정의되지 않습니다.
그렇지 않은 경우 ( 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 이동 할당 연산자가 제약되지 않음 제약됨