GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • cpprefjp - C++日本語リファレンス
  • GitHub Project

This view

  • Original page
  • New address

GeezerVison is showing cpprefjp.github.io — std::output_iterator - cpprefjp C++日本語リファレンス

  1. リファレンス
  2. iterator
  3. output_iterator

最終更新日時: 2026年09月19日 21時31分51秒 (JST)
rotarymars が更新

履歴 編集

concept
<iterator>

std::output_iterator(C++20)

namespace std {
  template<class I, class T>
  concept output_iterator =
    input_or_output_iterator<I> &&
    indirectly_writable<I, T> &&
    requires(I i, T&& t) {
      *i++ = std::forward<T>(t);  // 等しさを保持することを要求しない
    };
}

概要

output_iteratorは、イテレータ型Iが出力イテレータであることを表すコンセプトである。

output_iteratorとなるイテレータは、operator*による書き込みと前置/後置インクリメントによる進行が可能であるが、等値比較は必ずしも可能ではない。

モデル

decltype((E))が型Tを示す式E、間接参照可能な型Iのオブジェクトiについて次の条件を満たす場合に限って、型I, Tはoutput_iteratorのモデルである。

  • *i++ = E;は次の式と等価となる
    *i = E;
    ++i;
    

出力イテレータを用いるアルゴリズムは、同じイテレータ範囲を2回以上イテレートしてはならない。そのようなアルゴリズムはシングルパス(一回だけ走査する)でなければならない。

例

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

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

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


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

  friend auto operator*(const sample_output_iterator&) -> int&;

  using difference_type = int;
};


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

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

出力

int* is output_iterator<int>
std::vector<int>::iterator is output_iterator<int>
std::ostream_iterator<int> is output_iterator<int>
sample_output_iterator is output_iterator<int>

const int* is not output_iterator<int>
std::istream_iterator<int> is not output_iterator<int>
int* const is not output_iterator<int>

バージョン

言語

  • C++20

処理系

  • Clang: 13.0.1 ✅
  • GCC: 10.1 ✅
  • Visual C++: 2019 Update 6 ✅

関連項目

  • C++20 コンセプト

参照

  • P0896R4 The One Ranges Proposal (was Merging the Ranges TS)
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.