std:: contiguous_iterator
|
Definiert in Header
<iterator>
|
||
|
template
<
class
I
>
concept contiguous_iterator
=
|
(seit C++20) | |
Das
contiguous_iterator
-Konzept verfeinert
random_access_iterator
, indem es die Garantie bereitstellt, dass die bezeichneten Elemente zusammenhängend im Speicher gespeichert sind.
|
Gegeben einen Iterator
i
eines Typs, der
Dies bedeutet, dass ein Programm sich nicht auf Nebeneffekte des Dereferenzierens, Inkrementierens oder Dekrementierens eines contiguous Iterators i verlassen kann, weil Standardbibliotheksfunktionen möglicherweise mit Zeigern arbeiten, die durch std:: to_address ( i ) erhalten wurden, anstatt direkt mit i zu arbeiten. |
(seit C++26) |
Inhaltsverzeichnis |
Iterator-Konzeptbestimmung
Die Definition dieses Konzepts wird über einen nur zur Darstellung dienenden Alias-Template /*ITER_CONCEPT*/ spezifiziert.
Um /*ITER_CONCEPT*/ < I > zu bestimmen, sei ITER_TRAITS < I > definiert als I falls die Spezialisierung std:: iterator_traits < I > von der primären Template-Definition generiert wird, andernfalls als std:: iterator_traits < I > :
- Falls ITER_TRAITS < I > :: iterator_concept gültig ist und einen Typ benennt, bezeichnet /*ITER_CONCEPT*/ < I > den Typ.
- Andernfalls, falls ITER_TRAITS < I > :: iterator_category gültig ist und einen Typ benennt, bezeichnet /*ITER_CONCEPT*/ < I > den Typ.
-
Andernfalls, falls
std::
iterator_traits
<
I
>
von der primären Template-Spezialisierung generiert wird,
bezeichnet
/*ITER_CONCEPT*/
<
I
>
std::random_access_iterator_tag
.
(Das heißt, std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: contiguous_iterator_tag > wird als false angenommen.) - Andernfalls bezeichnet /*ITER_CONCEPT*/ < I > keinen Typ und führt zu einem Substitutionsfehler.
Semantische Anforderungen
Seien
a
und
b
dereferenzierbare Iteratoren und
c
ein nicht-dereferenzierbarer Iterator vom Typ
I
, sodass
b
von
a
erreichbar ist und
c
von
b
erreichbar ist. Der Typ
I
modelliert
contiguous_iterator
nur dann, wenn alle von ihm subsumierten Konzepte modelliert werden und alle folgenden Bedingungen erfüllt sind:
- std:: to_address ( a ) == std:: addressof ( * a ) .
- std:: to_address ( b ) == std:: to_address ( a ) + std:: iter_difference_t < I > ( b - a ) .
- std:: to_address ( c ) == std:: to_address ( a ) + std:: iter_difference_t < I > ( c - a ) .
- std:: to_address ( I { } ) ist wohldefiniert.
- ranges:: iter_move ( a ) hat denselben Typ, dieselbe Wertkategorie und dieselben Effekte wie std :: move ( * a ) .
- Wenn ranges:: iter_swap ( a, b ) wohldefiniert ist, hat es Effekte, die äquivalent zu ranges:: swap ( * a, * b ) sind.
Gleichheitserhaltung
Ausdrücke, die in requires expressions der Standardbibliothek-Konzepte deklariert werden, müssen equality-preserving sein (sofern nicht anders angegeben).
Implizite Ausdrucksvarianten
Ein requires -Ausdruck , der einen Ausdruck verwendet, der für einen konstanten Lvalue-Operanden nicht-modifizierend ist, erfordert ebenfalls implizite Ausdrucksvarianten .
Hinweise
contiguous_iterator
wird von jedem Zeigertyp auf einen vollständigen Objekttyp modelliert.
Iteratortypen in der Standardbibliothek, die in C++17 die Anforderungen an
LegacyContiguousIterator
erfüllen müssen, sind auch in C++20 verpflichtet, das Konzept
contiguous_iterator
zu modellieren.
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 3607 | C++20 |
contiguous_iterator
könnte benutzerdefinierte
ranges::iter_move und ranges::iter_swap Verhalten haben |
verboten |
| LWG 4170 | C++20 |
ein Paar wertinitialisierter
contiguous_iterator
s
könnte möglicherweise keinen leeren Bereich darstellen |
garantiert |
Siehe auch
|
(C++20)
|
spezifiziert, dass ein
bidirectional_iterator
ein Random-Access-Iterator ist, der Vorwärts- und Rückwärtsbewegung in konstanter Zeit und Indizierung unterstützt
(Konzept) |