- memory[meta header]
- std[meta namespace]
- unique_ptr[meta class]
- function[meta id-type]
- cpp11[meta cpp]
unique_ptr& operator=(unique_ptr&& u) noexcept; // (1) 単一オブジェクト、配列
template <class U, class E>
unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept; // (2) 単一オブジェクト、配列(C++17)
unique_ptr& operator=(nullptr_t) noexcept; // (3) 単一オブジェクト、配列
unique_ptr& operator=(const unique_ptr&) = delete; // (4) 単一オブジェクト、配列- nullptr_t[link /reference/cstddef/nullptr_t.md]
- (1) : 自身が保持しているリソースを解放し、
uから*thisに所有権を譲渡する。 - (2) : 自身が保持しているリソースを解放し、変換可能な
uから*thisに所有権を譲渡する - (3) : 自身が保持しているリソースを解放する。
- (4) : コピー代入禁止。
- (1) : デリータの型
Dが、例外を投げずにムーブ構築可能であること。 - (2) 単一オブジェクト : 以下の条件を満たさない場合、この関数はオーバーロード解決の候補から外れる:
unique_ptr<U, E>::pointerが、pointerに暗黙変換可能な型であること。Uが配列型ではないこと。is_assignable_v<D&, E&&> == trueであること。
- (2) 配列 : 以下の条件を満たさない場合、この関数はオーバーロード解決の候補から外れる:
Uは配列型であること。*thisの型UPについて、UP::pointerとUP::element_type*が同じ型であること。uの型UPについて、UP::pointerとUP::element_type*が同じ型であること。unique_ptr<U, D>::element_type(*)[]からunique_ptr<T[], D>::element_type(*)[]へ変換可能であること。is_assignable_v<D&, E&&> == trueであること。
- (1), (2) :
reset(u.release());
d_ = std::forward<E>(u.get_deleter());- reset[link reset.md]
- release[link release.md]
- std::forward[link /reference/utility/forward.md]
- get_deleter()[link get_deleter.md]
- (3) :
reset()
*this
投げない
#include <cassert>
#include <memory>
int main()
{
std::unique_ptr<int> p0(new int(3));
// (1) ムーブ代入
// p0の所有権をp1に譲渡する
std::unique_ptr<int> p1;
p1 = std::move(p0);
assert(*p1 == 3);
// (2) 変換可能な型からの所有権移動
// p1の所有権をp2に譲渡する
std::unique_ptr<void> p2;
p2 = std::move(p1);
assert(*static_cast<int*>(p2.get()) == 3);
// (3) リソース解放
std::unique_ptr<int> p3(new int(3));
p3 = nullptr;
assert(!p3);
}- std::move[link /reference/utility/move.md]
- C++11
- GCC: 4.4.7 (nullptr_tのオーバーロード以外), 4.6.4
- Clang libc++, C++11 mode: 3.0
- ICC: ?
- Visual C++: 2010, 2012, 2013
- 2010にはnullptr_tのオーバーロードがない。
- 2012までは、delete宣言に対応していないため、代わりにprivateで宣言のみ行う手法で代用されている。