std::ranges::range
| Definiert in Header <ranges>
|
||
template< class T >
concept range = requires( T& t ) {
ranges::begin(t); // equality-preserving for forward iterators
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 einen Sentinel bereitstellt, die die Elemente des Bereichs (range) bezeichnen.
Semantische Anforderungen
Gegeben sei ein Ausdruck
E
so dass
decltype
(
(
E
)
)
den Typ
T
hat.
T
modelliert
range
nur wenn
-
[ranges:: begin ( E ),ranges:: end ( E ))bezeichnet einen Range , und - sowohl ranges:: begin ( E ) als auch ranges:: end ( E ) amortisiert konstante Zeit benötigen und den Wert von E nicht in für gleichheitserhaltende Ausdrücke beobachtbarer Weise verändern, und
-
falls der Typ von
ranges::
begin
(
E
)
das Konzept
forward_iteratormodelliert, ranges:: begin ( E ) gleichheitserhaltend ist (mit anderen Worten: Forward-Iteratoren unterstützen Mehrfachdurchlauf-Algorithmen).
Hinweise
Eine typische
range
-Klasse benötigt nur zwei Funktionen:
-
Eine Memberfunktion
begin(), deren Rückgabetyp das Konzeptinput_or_output_iteratormodelliert. -
Eine Memberfunktion
end(), deren Rückgabetyp das Konzeptsentinel_for<It>modelliert, wobeiItder Rückgabetyp vonbegin()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 |