最終更新日時(UTC):
が更新

履歴 編集

function
<iterator>

std::common_iterator::iter_move(C++20)

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

    friend decltype(auto) iter_move(const common_iterator& i)
      noexcept(noexcept(ranges::iter_move(declval<const I&>())))
        requires input_iterator<I>;
  };
}

概要

common_iteratorの指す要素をムーブする。

事前条件

holds_alternative<I>(i.v_) == trueであること。

効果

以下と等価

return ranges::iter_move(get<I>(i.v_));

備考

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

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

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

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

  CI ci{std::counted_iterator{std::ranges::begin(vec), 5}};

  // ADLによる呼び出し
  int n1 = iter_move(ci);
  std::cout << n1 << std::endl;

  ++ci;

  // ranges::iter_move CPOによる呼び出し
  int n2 = std::ranges::iter_move(ci);
  std::cout << n2 << std::endl;
}

出力

1
2

バージョン

言語

  • C++20

処理系

関連項目

参照