Namensräume
Varianten
Aktionen

std::iterator_traits<std::counted_iterator>

Von cppreference.com
 
 
Iterator-Bibliothek
Iterator-Konzepte
Iterator-Primitive
Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(C++20)
Iterator-Adapter
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
Definiert in Header <iterator>
template< std::input_iterator I >

    requires /* siehe unten */
struct iterator_traits<std::counted_iterator<I>> : std::iterator_traits<I> {
    using pointer = std::conditional_t<std::contiguous_iterator<I>,
                                       std::add_pointer_t<std::iter_reference_t<I>>,
                                       void>;

};
(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-Klausel
pointer ist bedingungslos als void definiert
Beschränkung hinzugefügt

[bearbeiten] Siehe auch

bietet eine einheitliche Schnittstelle zu den Eigenschaften eines Iterators
(Klassentemplate)