最終更新日時: 2026年07月22日 16時08分23秒 (JST)
rotarymars が更新

履歴 編集

function

# ::node_handle::operator=(C++17)

    node_handle& operator=(node_handle&& nh);           // (1) C++17
    constexpr node_handle& operator=(node_handle&& nh); // (1) C++26

## 概要

ムーブ代入する。

## 要件

`!alloc_`、または`std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value` が `true`、または `alloc_ == nh.alloc_` のいずれか。

## 効果

- `ptr_ != nullptr` の場合、
  - `std::allocator_traits<allocator_type>::destroy` を呼び出して `ptr_` が指す `container_node_type` オブジェクト内の `value_type` サブオブジェクトを破棄し、
  - 次に `std::allocator_traits<allocator_type>::template rebind_traits<container_node_type>::deallocate` を呼び出して `ptr_` の割り当てを解除する。
- `ptr_` に `nh.ptr_` を代入する。
- `!alloc_` または `std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value` が `true` の場合、`nh.alloc_` を `alloc_` にムーブ代入する。
- `nh.ptr_` に `nullptr` を代入し、`nh.alloc_` に `nullopt` を代入する。

## 戻り値

`*this`

## 例外

なげない。

## 備考

ムーブオンリーであり、コピー構築はできない。

## 例

    #include <iostream>
    #include <set>
    #include <utility>

    int main()
    {
      std::set<int>::node_type nh;
      // std::set<int>::node_type nh2 = nh;         // コピー構築はできない
      std::set<int>::node_type nh2 = std::move(nh);
      std::cout << static_cast<bool>(nh2);
    }

### 出力

    0

## バージョン

### 言語

- C++17

### 処理系

- Clang: 7.0.0 ✅
- GCC: 7.1.0 ✅
- ICC: ??
- Visual C++: 2017 Update 5 ✅

## 参照

- Splicing Maps and Sets(Revision 5)
- P3372R3 constexpr containers and adaptors