最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

concept
<iterator>

# std::input_or_output_iterator(C++20)

    namespace std {
      template<class I>
      concept input_or_output_iterator =
        requires(I i) {
          { *i } -> can-reference;
        } &&
        weakly_incrementable<I>;
    }

## 概要

`input_or_output_iterator`は、イテレータ型`I`が`weakly_incrementable`であり、間接参照が何らかの結果を返すことを表すコンセプトである。

`input_or_output_iterator`はイテレータコンセプトの基礎となるコンセプトであり、イテレータに対する最小の要件である。全てのイテレータは本コンセプトのモデルとならなければならない。

## 備考

名前に`input_or_output`とあるがこれはイテレータ分類としてのそれらの共通部分のような意味であり、このコンセプトはイテレータを介した入出力やイテレータのコピー、イテレータの比較についてを何ら制約しない。

## 例

    #include <iostream>
    #include <concepts>
    #include <iterator>
    #include <memory>
    #include <vector>

    template<std::input_or_output_iterator I>
    void f(const char* name) {
      std::cout << name << " is input_or_output_iterator" << std::endl;
    }

    template<typename I>
    void f(const char* name) {
      std::cout << name << " is not input_or_output_iterator" << std::endl;
    }

    struct sample_input_or_output_iterator {
      friend auto operator++(sample_input_or_output_iterator&) -> sample_input_or_output_iterator&;
      friend auto operator++(sample_input_or_output_iterator&, int) -> sample_input_or_output_iterator;

      friend auto operator*(sample_input_or_output_iterator&) -> int;

      using difference_type = int;
    };

    struct sample_weak_incrementable {
      friend auto operator++(sample_weak_incrementable&) -> sample_weak_incrementable&;
      friend auto operator++(sample_weak_incrementable&, int) -> sample_weak_incrementable&;

      using difference_type = int;
    };

    int main() {
      f<int*>("int*");
      f<const int*>("const int*");
      f<std::vector<int>::iterator>("std::vector<int>::iterator");
      f<std::ostream_iterator<double>>("std::ostream_iterator<double>");
      f<sample_input_or_output_iterator>("sample_input_or_output_iterator");

      std::cout << "\n";
      f<int* const>("int* const");
      f<sample_weak_incrementable>("sample_weak_incrementable");
    }

### 出力

    int* is input_or_output_iterator
    const int* is input_or_output_iterator
    std::vector<int>::iterator is input_or_output_iterator
    std::ostream_iterator<double> is input_or_output_iterator
    sample_input_or_output_iterator is input_or_output_iterator

    int* const is not input_or_output_iterator
    sample_weak_incrementable is not input_or_output_iterator

## バージョン

### 言語

- C++20

### 処理系

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

## 関連項目

- C++20 コンセプト

## 参照

- P0896R4 The One Ranges Proposal (was Merging the Ranges TS)
- P1207R4 Movability of single-pass iterators