最終更新日時(UTC): 2026年01月05日 09時09分29秒
Koichi Murase が更新

履歴 編集

customization point object
<ranges>

# std::ranges::cbegin(C++20)

    namespace std::ranges {
      inline namespace /*unspecified*/ {
        inline constexpr /*unspecified*/ cbegin = /*unspecified*/;
      }
    }

## 概要

Rangeから先頭要素への読み取り専用イテレータを取得する関数オブジェクト。

## 効果

部分式`E`の型を`T`、`E`の評価結果オブジェクトを示す左辺値を`t`とする。このとき、式`ranges::cbegin(E)`の効果は以下の式と等しい。

- C++20まで
  1. `E`がlvalueであれば、`ranges::begin(static_cast<const T&>(E))`
  2. それ以外の場合、`ranges::begin(static_cast<const T&&>(E))`
- C++23から
  1. `E`が右辺値であり、`enable_borrowed_range<remove_cv_t<T>>`が`false`となる場合、`ranges::cbegin(E)`は不適格
  2. それ以外の場合、式`U`を`ranges::begin(possibly-const-range(t))`とすると、`const_iterator<decltype(U)>(U)`

## 戻り値

先頭要素への読み取り専用イテレータ。

## カスタマイゼーションポイント

Rangeが`const`な場合について`ranges::begin`をカスタマイズすることで、`ranges::cbegin`をカスタマイズできる。

## 備考

`ranges::cbegin`の呼び出しが有効な式であるとき、その型は`input_or_output_iterator`のモデルであり、C++23以降はさらに`constant-iterator`のモデルである。

C++20までは`range`型`R`の`begin()`の`const` オーバーロードを呼び出してていたため得られたイテレータは必ずしも定数イテレータではない場合があったが、C++23からはそこから定数イテレータが得られない場合に`basic_const_iterator`を使用することで確実に定数イテレータを取得する。

## 例

    #include <iostream>
    #include <vector>
    #include <ranges>
    #include <algorithm>

    int main()
    {
      std::vector<int> v = {1, 2, 3};

      decltype(v)::const_iterator first = std::ranges::cbegin(v);
      decltype(v)::const_iterator last = std::ranges::cend(v);

      std::for_each(first, last, [](const int& x) {
        std::cout << x << std::endl;
      });
    }

### 出力

    1
    2
    3

## バージョン

### 言語

- C++20

### 処理系

- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅

## 関連項目

- `std::cbegin`

## 参照

- N4861 24 Ranges library
- C++20 ranges
- P2278R4 `cbegin` should always return a constant iterator