最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<iterator>

# std::basic_const_iterator(C++23)

    namespace std {
      template<input_iterator Iterator>
      class basic_const_iterator;
    }

## 概要

`basic_const_iterator`は、イテレータをラップし、元の要素を定数（`const`）として参照するイテレータアダプタである。その他の操作は、元のイテレータそのものの動作をする。

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++23
`base` | 元のイテレータを取得する | C++23
`operator*` | 間接参照演算子 | C++23
`operator->` | メンバアクセス演算子 | C++23
`operator++` | イテレータをインクリメントする | C++23
`operator--` | イテレータをデクリメントする | C++23
`operator+=` | イテレータ自身を進める | C++23
`operator-=` | イテレータ自身を逆に進める | C++23
`operator-` | 2つの`basic_const_iterator`の差を求める | C++23
`operator[]` | 任意の位置にランダムアクセスする | C++23
`operator==` | 等値比較 | C++23
`operator!=` | 非等値比較 (`==`により使用可能) | C++23
`operator<` | 左辺が右辺より小さいかの判定を行う | C++23
`operator<=` | 左辺が右辺以下かの判定を行う | C++23
`operator>` | 左辺が右辺より大きいかの判定を行う | C++23
`operator>=` | 左辺が右辺以上かの判定を行う | C++23
`operator<=>` | 三方比較を行う | C++23

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`iterator_concept` | `Iterator`がモデルとなる最も強いイテレータコンセプトに対応するイテレータタグ型 | C++23
`iterator_category` | `Iterator`が`forward_iterator`のモデルである場合にのみ`iterator_traits<Iterator>::iterator_category`として定義される | C++23
`value_type` | `iter_value_t<Iterator>` | C++23
`difference_type` | `iter_difference_t<Iterator>` | C++23

`iterator_concept`は次のように決定される

- `Iterator`が`contiguous_iterator`のモデルとなる場合
  - `contiguous_iterator_tag`
- そうではなく、`Iterator`が`random_access_iterator`のモデルとなる場合
  - `random_access_iterator_tag`
- そうではなく、`Iterator`が`bidirectional_iterator`のモデルとなる場合
  - `bidirectional_iterator_tag`
- そうではなく、`Iterator`が`forward_iterator`のモデルとなる場合
  - `forward_iterator_tag`
- それ以外の場合
  - `input_iterator_tag`

## 非メンバ（Hidden friends）関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator<` | 左辺が右辺より小さいかの判定を行う | C++23
`operator<=` | 左辺が右辺以下かの判定を行う | C++23
`operator>` | 左辺が右辺より大きいかの判定を行う | C++23
`operator>=` | 左辺が右辺以上かの判定を行う | C++23
`operator+` | イテレータを進める | C++23
`operator-` | イテレータを逆に進める | C++23
`operator-` | 2つの`basic_const_iterator`の差を求める | C++23
`iter_move` | イテレータの要素の移動 | C++23

## 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`make_const_iterator` | `basic_const_iterator`のヘルパ関数 | C++23
`make_const_sentinel` | `basic_const_iterator`のヘルパ関数 | C++23

## 特殊化

名前 | 説明 | 対応バージョン
--- | --- | ---
`common_type` | `basic_const_iterator`とイテレータ型の間の共通の型を求める | C++23

## 例

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

    int main() {
      std::vector vec = {1, 2, 3, 4, 5};

      auto cit = std::make_const_iterator(vec.begin());

      std::cout << *cit << '\n';

      ++cit;

      std::cout << *cit << '\n';

      // 要素を変更できない
      //*cit = 0;
    }

### 出力

    1
    2

## バージョン

### 言語

- C++23

### 処理系

- Clang: ??
- GCC: 13.1 ✅
- Visual C++: 2022 Update 6 ✅

## 参照

- P2278R4 `cbegin` should always return a constant iterator