weak_ptr& operator=(const weak_ptr& r) noexcept; // (1)
template <class Y>
weak_ptr& operator=(const weak_ptr<Y>& r) noexcept; // (2)
template <class Y>
weak_ptr& operator=(const shared_ptr<Y>& r) noexcept; // (3)
weak_ptr& operator=(weak_ptr&& r) noexcept; // (4) C++14
template <class Y>
weak_ptr& operator=(weak_ptr<Y>&& r) noexcept; // (5) C++14
概要
- (1) :
*this
の現在の監視を停止し、r
の監視対象を新たに監視する。 - (2) :
*this
の現在の監視を停止し、変換可能なweak_ptr
オブジェクトr
の監視対象を新たに監視する。 - (3) :
*this
の現在の監視を停止し、新たにr
を監視する。 - (4) :
*this
の現在の監視を停止し、r
の監視対象を*this
に移動する。 - (5) :
*this
の現在の監視を停止し、変換可能なweak_ptr
オブジェクトr
の監視対象を*this
に移動する。
効果
- (1), (2), (3) : 以下と等価の効果を持つ。
- (4), (5) : 以下と等価の効果を持つ。
戻り値
*this
例外
投げない
例
#include <cassert>
#include <iostream>
#include <memory>
int main()
{
// (1)
// 他のweak_ptrオブジェクトの監視対象を、新たに監視する
std::shared_ptr<int> sp1(new int(3));
std::weak_ptr<int> wp1_org = sp1; // wp1_orgはsp1を監視する
std::weak_ptr<int> wp1;
wp1 = wp1_org; // wp1はwp1_orgの監視対象を監視する
if (std::shared_ptr<int> r = wp1.lock()) {
std::cout << *r << std::endl;
}
// (2)
// 他の変換可能なweak_ptrオブジェクトの監視対象を、新たに監視する
std::shared_ptr<int> sp2(new int(3));
std::weak_ptr<int> wp2_org = sp2;
std::weak_ptr<void> wp2;
wp2 = wp2_org;
if (std::shared_ptr<int> r = std::static_pointer_cast<int>(wp2.lock())) {
std::cout << *r << std::endl;
}
// (3)
// shared_ptrオブジェクトを新たに監視する
std::shared_ptr<int> sp3(new int(3));
std::weak_ptr<int> wp3;
wp3 = sp3;
if (std::shared_ptr<int> r = wp3.lock()) {
std::cout << *r << std::endl;
}
// (4)
// weak_ptrオブジェクトの監視対象を移動する
std::shared_ptr<int> sp4(new int(3));
std::weak_ptr<int> wp4_org = sp4;
std::weak_ptr<int> wp4;
wp4 = std::move(wp4_org);
if (std::shared_ptr<int> r = wp4.lock()) {
std::cout << *r << std::endl;
}
// (5)
// 変換可能なweak_ptrオブジェクトの監視対象を移動する
std::shared_ptr<int> sp5(new int(3));
std::weak_ptr<int> wp5_org = sp5;
std::weak_ptr<void> wp5;
wp5 = std::move(wp5_org);
if (std::shared_ptr<int> r = std::static_pointer_cast<int>(wp5.lock())) {
std::cout << *r << std::endl;
}
}
出力
3
3
3
3
3
バージョン
言語
- C++11
処理系
- GCC: 4.3.6 ✅
- Clang: 3.0 ✅
- ICC: ?
- Visual C++: ?