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

履歴 編集

customization point object
<ranges>

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

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

## 概要

Rangeから、最後尾要素の次を指す読み取り専用イテレータもしくは番兵を取得する関数オブジェクト。

## 効果

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

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

## 戻り値

最後尾要素の次を指す読み取り専用イテレータもしくは番兵。

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

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

## 備考

`ranges::cend(E)`が有効な式であるとき、`ranges::cend(E)`の型`S`、`ranges::cbegin(E)`の型`I`は`sentinel_for<S, I>`のモデルである。C++23以降はさらに、`S`が`input_iterator`のモデルならば`S`は`constant-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::cend`

## 参照

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