Namespaces
Variants

std::ranges::range

ja.cppreference.net より
 
 
Ranges ライブラリ
Range アダプタ
 
ヘッダ <ranges>
template< class T >
concept range = requires( T& t ) {
    ranges::begin(t); // equality-preserving for forward iterators
    ranges::end (t);
};
で定義 (C++20以上)

コンセプト range は、その要素に対するイテレータと番兵を提供することで範囲の要素を反復できる型の要件を定義します。

セマンティック要件

式 E が decltype ( ( E ) ) の型が T であるとき、 T が range をモデルするのは以下の場合に限られます

注記

典型的な range クラスは、次の2つの関数のみを提供する必要があります:

  1. begin() メンバ関数で、その戻り値の型が input_or_output_iterator コンセプトをモデルするもの。
  2. end() メンバ関数で、その戻り値の型が sentinel_for <It> コンセプトをモデルするもの。ここで It は begin() の戻り値の型である。

あるいは、非メンバ関数として定義され、 argument-dependent lookup によって発見されることもあります。

例

#include <ranges>
// 最小限の範囲
struct SimpleRange
{
    int* begin();
    int* end();
};
static_assert(std::ranges::range<SimpleRange>);
// 範囲ではない: begin/endがない
struct NotRange
{
    int t {};
};
static_assert(!std::ranges::range<NotRange>);
// 範囲ではない: beginがinput_or_output_iteratorを返さない
struct NotRange2
{
    void* begin();
    int* end();
};
static_assert(!std::ranges::range<NotRange2>);
int main() {}

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3915 C++20 ranges:: begin ( t ) および ranges:: end ( t )
は暗黙的な式バリエーションを要求していなかった
冗長な記述を
削除した