最終更新日時(UTC): 2026年02月26日 04時20分38秒
Akira Takahashi が更新

履歴 編集

function
<iterator>

# std::common_iterator::iter_swap(C++20)

    namespace std {
      template<input_or_output_iterator I, sentinel_for<I> S>
      class common_iterator {

        template<indirectly_swappable<I> I2, class S2>
        friend void iter_swap(const common_iterator& x, const common_iterator<I2, S2>& y)
          noexcept(noexcept(ranges::iter_swap(declval<const I&>(), declval<const I2&>())));
      };
    }

## 概要

2つの`common_iterator`の指す要素を交換する。

## 堅牢化された事前条件

`holds_alternative<I>(x.v_)`、`holds_alternative<I2>(y.v_)`はどちらも`true`であること。

## 効果

以下と等価

    return ranges::iter_swap(get<I>(x.v_), get<I2>(y.v_));

## 備考

この関数は`common_iterator`のクラス定義内で`friend`関数として定義される。そのため、メンバ関数としても非メンバ関数としても明示的に呼び出すことはできず、ADLによってのみ呼び出すことができる。 基本的には`ranges::iter_swap` カスタマイゼーションポイントオブジェクトを通して利用する。

## 例

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

    int main() {
      std::vector<int> v1 = {1, 2, 3, 4, 5};
      std::vector<int> v2 = {6, 7, 8, 9, 10};

      // common_iteratorを通すことでイテレータ型と番兵型を合わせる
      using CI = std::common_iterator<std::counted_iterator<std::vector<int>::iterator>, std::default_sentinel_t>;

      CI ci1{std::counted_iterator{std::ranges::begin(v1), 2}};
      CI ci2{std::counted_iterator{std::ranges::begin(v2), 2}};

      // ADLによる呼び出し
      iter_swap(ci1, ci2);

      ++ci1;
      ++ci2;

      // ranges::iter_swap CPOによる呼び出し
      std::ranges::iter_swap(ci1, ci2);

      for (int n : v1) {
        std::cout << n << ' ';
      }

      std::cout << '\n';

      for (int n : v2) {
        std::cout << n << ' ';
      }
    }

### 出力

    6 7 3 4 5
    1 2 8 9 10

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 9 ✅

## 関連項目

- `ranges::iter_swap`

## 参照

- P0896R4 The One Ranges Proposal (was Merging the Ranges TS)
- P3697R1 Minor additions to C++26 standard library hardening
- P3878R1 Standard library hardening should not use the 'observe' semantic