最終更新日時: 2024年12月05日 11時54分34秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<iterator>

# std::reverse_iterator::operator=

    reverse_iterator& operator=(const reverse_iterator& u) = default;           // (1) C++03
    constexpr reverse_iterator& operator=(const reverse_iterator& u) = default; // (1) C++17

    template <class U>
    reverse_iterator& operator=(const reverse_iterator<U>& u);                  // (2) C++03
    template <class U>
    constexpr reverse_iterator& operator=(const reverse_iterator<U>& u);        // (2) C++17

## 概要

- (2) : `u.base()`をメンバ変数`current`に保持する。

## テンプレートパラメータ制約

- C++17まで
  - (2) : `U`が`Iterator`に変換可能であること
- C++20
  - (2) : 次の両方を満たす
    - `is_same_v<U, Iterator> == false`であること。
    - `const U&, Iterator`が`convertible_to<Iterator>`のモデルとなること。
    - `Iterator&, const U&`が`assignable_from<Iterator&, const U&>`のモデルとなること。

## 戻り値

`*this`

## 例

    #include <iostream>
    #include <vector>
    #include <iterator>

    int main()
    {
      std::vector<int> v = {1, 2, 3};

      std::reverse_iterator<decltype(v)::iterator> it1(v.end());

      // 同じ型のイテレータを代入
      std::reverse_iterator<decltype(v)::iterator> it2;
      it2 = it1;

      // 変換可能なイテレータを代入
      std::reverse_iterator<decltype(v)::const_iterator> it3;
      it3  = it2;

      std::reverse_iterator<decltype(v)::const_iterator> end(v.begin());

      for (; it3 != end; ++it3) {
        std::cout << *it3 << std::endl;
      }
    }

### 出力

    3
    2
    1

## 参照

- P0031R0 A Proposal to Add Constexpr Modifiers to `reverse_iterator`, `move_iterator`, `array` and Range Access
- LWG Issue 3435. `three_way_comparable_with<reverse_iterator<int*>, reverse_iterator<const int*>>`