Namespaces
Variants

std::ranges:: range

From cppreference.net
Ranges library
Range adaptors
定義先ヘッダ <ranges>
template < class T >

concept range = requires ( T & t ) {
ranges:: begin ( t ) ; // 前方イテレータに対して等価性を保持する
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 )
は暗黙的な式バリエーションを要求していなかった
冗長な記述を
削除した