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() の代入がill-formedであるか、例外を投げる場合、動作は未定義です。
そうでなければ( E が参照型の場合)、 E 型の lvalue から get_deleter() を代入することが ill-formed であるか、例外をスローする場合、動作は未定義です。
3) reset() を呼び出すことと実質的に同じです。
4) コピー代入演算子は明示的に削除されています。

目次

パラメータ

r - 所有権が転送されるスマートポインタ

戻り値

* this

注記

ムーブオンリー型として、 unique_ptr の代入演算子は 右辺値 引数のみを受け付けます(例: 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=
修飾変換を拒否していた
受け入れる
LWG 2228
( N4366 )
C++11 変換代入演算子に
代入可能性の制約が欠落していた
制約を追加
LWG 2246 C++11 変換された r のデリーターの
代入先が指定されていなかった
get_deleter() として指定
LWG 2899 C++11 ムーブ代入演算子に制約がなかった 制約を追加