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

履歴 編集

concept
<ranges>

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

    namespace std::ranges {
      template<class T>
      concept common_range = range<T> && same_as<iterator_t<T>, sentinel_t<T>>;
    }

## 概要

`common_range`は、イテレータと番兵の型が等しいRangeを表すコンセプトである。

標準のコンテナはすべて`common_range`のモデルである。

## モデル

型`T`が`common_range`のモデルとなるのは、`T`が`range`のモデルであり、`T`から取得した番兵とイテレータの型が等しい場合である。

## 例

    #include <ranges>

    int main() {
      namespace ranges = std::ranges;
      namespace views = std::views;

      // 無限長のiotaはcommon_rangeではない
      // (イテレータと番兵の型が異なる)
      static_assert(!ranges::common_range<decltype(views::iota(0))>);

      // commonを適用するとcommon_rangeになる
      static_assert(ranges::common_range<decltype(views::iota(0) | views::common)>);
    }

### 出力

## バージョン

### 言語

- C++20

### 処理系

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

## 関連項目

- C++17 範囲 for ループの制限緩和
  範囲for文は、C++17の時点で先行して`common_range`ではない範囲を扱えるようになっている
- `views::common`
  任意の範囲を`common_range`に変換するRangeアダプタオブジェクト

## 参照

- N4861 24 Ranges library
- C++20 ranges