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()
への
rvalue
型
Deleterからの代入が例外をスローする場合。
それ以外の場合 (
Deleter
が参照型である場合)、以下の場合の動作は未定義です:
-
std::remove_reference<Deleter>::typeが CopyAssignable でない場合、または -
get_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(*)[]に変換可能であること。
-
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 | ムーブ代入演算子に制約がなかった | 制約を追加 |