最終更新日時: 2026年07月22日 11時09分53秒 (JST)
rotarymars が更新

履歴 編集

function
<memory>

# std::weak_ptr::operator=(C++11)

    weak_ptr&
    operator=(const weak_ptr& r) noexcept;      // (1) C++11
    constexpr weak_ptr&
    operator=(const weak_ptr& r) noexcept;      // (1) C++26

    template <class Y>
    weak_ptr&
    operator=(const weak_ptr<Y>& r) noexcept;   // (2) C++11
    template <class Y>
    constexpr weak_ptr&
    operator=(const weak_ptr<Y>& r) noexcept;   // (2) C++26

    template <class Y>
    weak_ptr&
    operator=(const shared_ptr<Y>& r) noexcept; // (3) C++11
    template <class Y>
    constexpr weak_ptr&
    operator=(const shared_ptr<Y>& r) noexcept; // (3) C++26

    weak_ptr&
    operator=(weak_ptr&& r) noexcept;           // (4) C++14
    constexpr weak_ptr&
    operator=(weak_ptr&& r) noexcept;           // (4) C++26

    template <class Y>
    weak_ptr&
    operator=(weak_ptr<Y>&& r) noexcept;        // (5) C++14
    template <class Y>
    constexpr weak_ptr&
    operator=(weak_ptr<Y>&& r) noexcept;        // (5) C++26

## 概要

- (1) : `*this`の現在の監視を停止し、`r`の監視対象を新たに監視する。
- (2) : `*this`の現在の監視を停止し、変換可能な`weak_ptr`オブジェクト`r`の監視対象を新たに監視する。
- (3) : `*this`の現在の監視を停止し、新たに`r`を監視する。
- (4) : `*this`の現在の監視を停止し、`r`の監視対象を`*this`に移動する。
- (5) : `*this`の現在の監視を停止し、変換可能な`weak_ptr`オブジェクト`r`の監視対象を`*this`に移動する。

## 効果

- (1), (2), (3) : 以下と等価の効果を持つ。

    weak_ptr(r).swap(*this)

- (4), (5) : 以下と等価の効果を持つ。

    weak_ptr(move(r)).swap(*this)

## 戻り値

`*this`

## 例外

投げない

## 例

    #include <cassert>
    #include <iostream>
    #include <memory>
    #include <utility>

    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++: ?

## 参照

- LWG Issue 2315. `weak_ptr` should be movable
- P3037R6 `constexpr std::shared_ptr` and friends