Namensräume
Varianten
Aktionen

std::ranges::Bereich

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
Definiert in der Header-Datei <ranges>
template< class T >

Konzept Bereich = erfordert( T& t ) {
    ranges::begin(t); // gleichheitserhaltend für Vorwärtsiteratoren
    ranges::end (t);

};
(seit C++20)

Das Konzept Bereich definiert die Anforderungen an einen Typ, der die Iteration über seine Elemente ermöglicht, indem er einen Iterator und ein Sentinel bereitstellt, die die Elemente des Bereichs bezeichnen.

Inhalt

[bearbeiten] Semantische Anforderungen

Gegeben einen Ausdruck E, sodass decltype((E)) T ist, modelliert T nur dann Bereich, wenn

[bearbeiten] Hinweise

Eine typische Bereich-Klasse muss nur zwei Funktionen bereitstellen

  1. Eine Member-Funktion begin(), deren Rückgabetyp input_or_output_iterator modelliert.
  2. Eine Member-Funktion end(), deren Rückgabetyp sentinel_for<It> modelliert, wobei It der Rückgabetyp von begin() ist.

Alternativ können dies Nicht-Member-Funktionen sein, die über argumentabhängige Suche gefunden werden.

[bearbeiten] 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() {}

[bearbeiten] Fehlerberichte

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

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