std::contiguous_iterator
| Definiert in Header <iterator> |
||
| template< class I > concept contiguous_iterator = |
(seit C++20) | |
Das Konzept contiguous_iterator verfeinert random_access_iterator, indem es garantiert, dass die bezeichneten Elemente zusammenhängend im Speicher gespeichert sind.
Inhalt |
[bearbeiten] Bestimmung des Iterator-Konzepts
Die Definition dieses Konzepts wird über ein expositions-only-Alias-Template /*ITER_CONCEPT*/ spezifiziert.
Um /*ITER_CONCEPT*/<I> zu bestimmen, bezeichne ITER_TRAITS<I> I, wenn die Spezialisierung std::iterator_traits<I> aus der Primärvorlage generiert wird, andernfalls std::iterator_traits<I>.
- Wenn ITER_TRAITS<I>::iterator_concept gültig ist und einen Typ benennt, bezeichnet /*ITER_CONCEPT*/<I> diesen Typ.
- Andernfalls, wenn ITER_TRAITS<I>::iterator_category gültig ist und einen Typ benennt, bezeichnet /*ITER_CONCEPT*/<I> diesen Typ.
- Andernfalls, wenn std::iterator_traits<I> aus der primären Vorlage generiert wird, bezeichnet /*ITER_CONCEPT*/<I> std::random_access_iterator_tag.
- Andernfalls bezeichnet /*ITER_CONCEPT*/<I> keinen Typ und führt zu einem Substitutionsfehler.
[bearbeiten] Semantische Anforderungen
Seien a und b dereferenzierbare Iteratoren und c ein nicht dereferenzierbarer Iterator vom Typ I, so dass b von a erreichbar ist und c von b erreichbar ist. Der Typ I modelliert contiguous_iterator nur, 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 wohlgeformt.
- ranges::iter_move(a) hat denselben Typ, dieselbe Wertkategorie und dieselben Effekte wie std::move(*a).
- Wenn ranges::iter_swap(a, b) wohlgeformt ist, hat es Effekte, die äquivalent zu ranges::swap(*a, *b) sind.
[bearbeiten] Gleichheitserhaltung
Ausdrücke, die in requires-Ausdrücken der Standardbibliothekskonzepte deklariert sind, müssen gleichheitserhaltend sein (sofern nicht anders angegeben).
[bearbeiten] Implizite Ausdrucksvariationen
Ein requires-Ausdruck, der einen Ausdruck verwendet, der für einen konstanten Lvalue-Operanden nicht-modifizierend ist, erfordert ebenfalls implizite Ausdrucksvariationen.
[bearbeiten] Anmerkungen
contiguous_iterator wird von jedem Zeigertyp auf einen vollständigen Objekttyp modelliert.
Iterator-Typen in der Standardbibliothek, die die LegacyContiguousIterator-Anforderungen in C++17 erfüllen müssen, müssen in C++20 auch contiguous_iterator modellieren.
[bearbeiten] Defect reports
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 3607 | C++20 | contiguous_iterator könnte benutzerdefinierteranges::iter_move und ranges::iter_swap Verhaltensweisen haben |
verboten |
| LWG 4170 | C++20 | ein Paar wertinitialisierter contiguous_iteratorskönnte möglicherweise keinen leeren Bereich darstellen |
garantiert |
[bearbeiten] Siehe auch
| (C++20) |
spezifiziert, dass ein bidirectional_iterator ein Zufallszugriff-Iterator ist, der die Vorwärtsbewegung in konstanter Zeit und Indizierung unterstützt(Konzept) |