std::ranges::Bereich
Von cppreference.com
| Definiert in der Header-Datei <ranges> |
||
| template< class T > Konzept Bereich = erfordert( T& 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
-
[ranges::begin(E),ranges::end(E))einen Bereich bezeichnet, und - sowohl ranges::begin(E) als auch ranges::end(E) amortisiert konstante Zeit haben und den Wert von E nicht auf eine Weise verändern, die für gleichheitserhaltende Ausdrücke beobachtbar ist, und
- wenn der Typ von ranges::begin(E)
forward_iteratormodelliert, dann ist ranges::begin(E) gleichheitserhaltend (mit anderen Worten, Vorwärtsiteratoren unterstützen Mehrpass-Algorithmen).
[bearbeiten] Hinweise
Eine typische Bereich-Klasse muss nur zwei Funktionen bereitstellen
- Eine Member-Funktion
begin(), deren Rückgabetypinput_or_output_iteratormodelliert. - Eine Member-Funktion
end(), deren Rückgabetypsentinel_for<It>modelliert, wobeiItder Rückgabetyp vonbegin()ist.
Alternativ können dies Nicht-Member-Funktionen sein, die über argumentabhängige Suche gefunden werden.
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#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 |