std::basic_const_iterator
| Definiert in Header <iterator> |
||
| template< std::input_iterator Iter > class basic_const_iterator; |
(seit C++23) | |
std::basic_const_iterator ist ein Iterator-Adapter, der sich exakt wie der zugrunde liegende Iterator verhält (der mindestens ein LegacyInputIterator sein muss oder input_iterator modelliert), außer dass das Dereferenzieren den vom zugrunde liegenden Iterator zurückgegebenen Wert als unveränderlich konvertiert. Spezialisierungen von std::basic_const_iterator sind konstante Iteratoren, d.h., der Iterator kann niemals als Ausgabeiterator verwendet werden, da das Modifizieren von Elementen nicht erlaubt ist.
Inhalt |
[bearbeiten] Member-Typen
| Mitgliedertyp | Definition |
iterator_category(bedingt vorhanden) |
Wenn
Andernfalls gibt es keinen Member |
iterator_concept
|
|
value_type
|
std::iter_value_t<Iter> |
difference_type
|
std::iter_difference_t<Iter> |
reference (privat) |
std::iter_const_reference_t<Iter> ((nur zur Veranschaulichung)*) |
[bearbeiten] Member-Objekte
| Member-Name | Definition |
current (privat) |
der zugrunde liegende Iterator, von dem base() kopiert oder verschiebt((exposition-only member object*) |
[bearbeiten] Member-Funktionen
konstruiert einen neuen basic_const_iterator(öffentliche Memberfunktion) | |
| greift auf den zugrundeliegenden Iterator zu (öffentliche Memberfunktion) | |
| greift auf das dereferenzierte Element zu (öffentliche Memberfunktion) | |
| greift per Index auf ein Element zu (öffentliche Memberfunktion) | |
| bewegt den Iterator vorwärts oder rückwärts (public member function) | |
| konvertiert in jeden konstanten Iterator, in den ein zugrunde liegender Iterator konvertierbar ist (public member function) | |
| vergleicht die zugrundeliegenden Iteratoren (public member function) |
[bearbeiten] Nicht-Member-Funktionen
vergleicht basic_const_iterator mit Nicht-basic_const_iterator(function template) | |
| (C++23) |
bewegt den Iterator vorwärts oder rückwärts (function template) |
| (C++23) |
berechnet die Distanz zwischen zwei Iterator-Adaptoren (Funktionstemplate) |
| (C++23) |
castet das Ergebnis der Dereferenzierung des zugrundeliegenden Iterators in seinen zugehörigen rvalue-Referenztyp (Funktion) |
[bearbeiten] Hilfs-Klassen
bestimmt den gemeinsamen Typ eines Iterators und eines angepassten basic_const_iterator-Typs(class template specialization) |
[bearbeiten] Hilfs-Alias-Templates
| template< std::input_iterator I > using const_iterator = /* siehe Beschreibung */; |
(seit C++23) | |
Wenn I constant-iterator (ein Exposition-Only-Konzept) modelliert, dann bezeichnet const_iterator<I> einen Typ I. Andernfalls bezeichnet es basic_const_iterator<I>.
| template< std::semiregular S > using const_sentinel = /* siehe Beschreibung */; |
(seit C++23) | |
Wenn S input_iterator modelliert, dann bezeichnet const_sentinel<S> einen Typ const_iterator<S>. Andernfalls bezeichnet es S.
[bearbeiten] Hilfs-Funktions-Templates
| template< std::input_iterator T > constexpr const_iterator<T> make_const_iterator( I it ) { return it; } |
(seit C++23) | |
| template< std::semiregular S > constexpr const_sentinel<S> make_const_sentinel( S s ) { return s; } |
(seit C++23) | |
[bearbeiten] Hinweise
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges_as_const |
202207L |
(C++23) | std::basic_const_iterator
|
202311L |
(C++23) (DR) |
std::basic_const_iterator sollte der Konvertierbarkeit seines zugrunde liegenden Typs folgen |
[bearbeiten] Beispiel
#include <cassert> #include <iterator> #include <vector> int main() { std::vector v{1, 2, 3}; std::vector<int>::iterator i = v.begin(); *i = 4; // OK, v[0] == 4 now i[1] = 4; // OK, the same as *(i + 1) = 4; auto ci = std::make_const_iterator(i); assert(*ci == 4); // OK, can read the underlying object assert(ci[0] == 4); // OK, ditto // *ci = 13; // Error: location is read-only // ci[0] = 13; // Error: ditto ci.base()[0] = 42; // OK, underlying iterator is writable assert(*ci == 42); // OK, underlying location v[0] was modified }
[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 |
|---|---|---|---|
| P2836R1 | C++23 | basic_const_iterator folgt nicht der Konvertierbarkeit seines zugrunde liegenden Typs |
Konvertierungsoperator bereitgestellt |