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

履歴 編集

function
<iterator>

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

    common_iterator& operator++();    // (1)
    decltype(auto) operator++(int);   // (2)

## 概要

イテレータをインクリメントする。

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

`holds_alternative<I>(v_) == true`

## 効果

`I, S`の値のどちらかを`variant<I, S>`型のメンバ変数`v_`に保持しているとして

- (1) : 以下と等価

      ++get<I>(v_);
      return *this;

- (2) : 次のどちらかと等価

  - `I`が`forward_iterator`のモデルである場合

        common_iterator tmp = *this;
        ++*this;
        return tmp;

  - それ以外の場合 : `return get<I>(v_)++;`

## 例

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

    int main() {
      auto seq = std::views::iota(1) | std::views::take(5);

      // common_iteratorを通すことでイテレータ型と番兵型を合わせる
      using CI = std::common_iterator<std::ranges::iterator_t<decltype(seq)>, std::ranges::sentinel_t<decltype(seq)>>;

      CI ci{std::ranges::begin(seq)};

      std::cout << *ci << std::endl;

      ++ci;

      std::cout << *ci << std::endl;

      ci++;

      std::cout << *ci << std::endl;
    }

### 出力

    1
    2
    3

## バージョン

### 言語

- C++20

### 処理系

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

## 参照

- 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