Namespaces
Variants

std::ranges:: range

From cppreference.net
Ranges library
Range adaptors
Definiert im Header <ranges>
template < class T >

concept range = requires ( T & t ) {
ranges:: begin ( t ) ; // gleichheitserhaltend für Forward-Iteratoren
ranges:: end ( t ) ;

} ;
(seit C++20)

Das range -Konzept definiert die Anforderungen eines Typs, der die Iteration über seine Elemente ermöglicht, indem es einen Iterator und Sentinel bereitstellt, die die Elemente des Bereichs bezeichnen.

Inhaltsverzeichnis

Semantische Anforderungen

Gegeben sei ein Ausdruck E so dass decltype ( ( E ) ) den Typ T hat. T modelliert range nur wenn

Hinweise

Eine typische range -Klasse benötigt nur zwei Funktionen:

  1. Eine Memberfunktion begin() , deren Rückgabetyp das Konzept input_or_output_iterator modelliert.
  2. Eine Memberfunktion end() , deren Rückgabetyp das Konzept sentinel_for <It> modelliert, wobei It der Rückgabetyp von begin() ist.

Alternativ können sie auch Nicht-Mitgliedsfunktionen sein, die durch argumentabhängige Namenssuche gefunden werden.

Beispiel

#include <ranges>
// A minimum range
struct SimpleRange
{
    int* begin();
    int* end();
};
static_assert(std::ranges::range<SimpleRange>);
// Not a range: no begin/end
struct NotRange
{
    int t {};
};
static_assert(!std::ranges::range<NotRange>);
// Not a range: begin does not return an input_or_output_iterator
struct NotRange2
{
    void* begin();
    int* end();
};
static_assert(!std::ranges::range<NotRange2>);
int main() {}

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 3915 C++20 ranges:: begin ( t ) und ranges:: end ( t )
erforderten keine impliziten Ausdrucksvarianten
entfernte die
redundante Beschreibung