最終更新日時(UTC):
が更新

履歴 編集

concept
<ranges>

std::ranges::range(C++20)

namespace std::ranges {
  template<class T>
  concept range = requires(T& t) {
    ranges::begin(t);
    ranges::end(t);
  };
}

概要

rangeは、型Tが(範囲ライブラリの扱う対象という意味においての)範囲であることを表すコンセプトである。

モデル

decltype((t))T&であるような式tがあるとする。Trangeのモデルとなるのは、以下の条件をすべて満たす場合である。

  1. [ranges::begin(t), ranges::end(t)) が範囲を表す。
  2. ranges::begin(t)ranges::end(t)は共に償却定数時間で値を返し、範囲を変更しない。
  3. ranges::begin(t)forward_iteratorのモデルであるならば、ranges::begin(t)は等しさを保持する(equality‑preserving)。

式が等しさを保持する(equality‑preserving)とは、同じ入力に対しては常に同じ結果となることをいう。

2番目の要件では、要件が償却定数時間であることにより、イテレータを取得するタイミングで初めて要素を生成するような実装が許可される。

備考

ranges::begin(t)ranges::end(t)forward_iteratorを返し、等しさを保持するならば、その範囲を何度もアルゴリズム関数に渡したり、イテレータを繰り返し取得して使ったりしてもよい。

イテレータがforward_iteratorのモデルではない場合は、ranges::beginでイテレータを繰り返し取得したときに同じオブジェクトが返る保証はなく、結果が一意に定まるともいえない。そのような場合、ranges::beginの呼び出しは範囲1つあたり1回に留めなければならない。

#include <ranges>
#include <vector>

int main()
{
  static_assert(std::ranges::range<std::vector<int>>);
  static_assert(std::ranges::range<int[3]>);
  static_assert(!std::ranges::range<double>);
  static_assert(!std::ranges::range<const char*>);
  static_assert(!std::ranges::range<int[]>);
}

出力

バージョン

言語

  • C++20

処理系

参照