std::ranges:: range
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | ||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
|
Definiert im Header
<ranges>
|
||
|
template
<
class
T
>
concept range
=
requires
(
T
&
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
-
[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 |