std::iterator_traits<std::counted_iterator>
| Definiert in Header <iterator> |
||
| template< std::input_iterator I > requires /* siehe unten */ |
(seit C++20) | |
Erbt die Eigenschaften von angepassten (generiert entweder aus einer Standard-Teilspezialisierung oder einer programmierdefinierten Spezialisierung) std::iterator_traits<I>, wobei der Mitgliedstyp pointer angepasst ist, wobei I einen input_iterator modelliert.
Insbesondere werden iterator_concept (falls vorhanden) und iterator_category von std::iterator_traits<I> geerbt.
Die Bedingung in der Requires-Klausel ist true genau dann, wenn std::iterator_traits<I> nicht aus der Primärvorlage generiert wird.
Inhalt |
[bearbeiten] Hinweis
Vor P2259R1 wird diese Spezialisierung auch dann verwendet, wenn std::iterator_traits<I> aus der Primärvorlage generiert wird. Infolgedessen wird bei der Prüfung von std::counted_iterator<I> gegen ein Iterator-Konzept (z. B. forward_iterator) die Bestimmung von /*ITER_CONCEPT*/ nicht berücksichtigt I::iterator_concept und somit verhält sich std::counted_iterator<I> manchmal fälschlicherweise so, als ob es dieses Konzept nicht modellieren könnte. Dieses fehlerhafte Verhalten ist in libstdc++ vor 10.4 und in MSVC STL vor VS 2022 17.0 Preview 3 implementiert.
Die Standardbibliothek stellt Teilspezialisierungen von std::iterator_traits für Zeigertypen, std::counted_iterator und std::common_iterator zur Verfügung.
[bearbeiten] Beispiel
#include <iterator> #include <list> #include <type_traits> #include <vector> int main() { std::vector v{1, 2, 3, 4}; std::list l{1, 2, 3, 4}; std::counted_iterator iv{v.begin(), 3}; std::counted_iterator il{l.begin(), 3}; static_assert(std::is_same<int*, std::iterator_traits<decltype(iv)>::pointer>()); static_assert(std::is_same<void, std::iterator_traits<decltype(il)>::pointer>()); }
[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 |
|---|---|---|---|
| P2259R1 | C++20 | Es gibt keine Requires-Klauselpointer ist bedingungslos als void definiert |
Beschränkung hinzugefügt |
[bearbeiten] Siehe auch
| bietet eine einheitliche Schnittstelle zu den Eigenschaften eines Iterators (Klassentemplate) |