Namespaces
Variants

std:: iterator_traits <std::counted_iterator>

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(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 im Header <iterator>
template < std:: input_iterator I >

erfordert /* 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 (erzeugt entweder durch eine Standard-Partialspezialisierung oder eine programmdefinierte Spezialisierung) std:: iterator_traits < I > , wobei der Member-Typ pointer angepasst wird, wobei I das Konzept input_iterator modelliert.

Insbesondere werden das iterator_concept (falls vorhanden) und das iterator_category von std:: iterator_traits < I > geerbt.

Die Bedingung in der Requires-Klausel ist true genau dann, wenn std:: iterator_traits < I > nicht von der primären Template generiert wird.

Inhaltsverzeichnis

Hinweis

Vor P2259R1 wurde diese Spezialisierung verwendet, selbst wenn std:: iterator_traits < I > von der primären Template generiert wird. Infolgedessen wird bei der Überprüfung von std:: counted_iterator < I > gegen ein Iterator-Konzept (z.B. forward_iterator ) die Bestimmung von /*ITER_CONCEPT*/ ohne Berücksichtigung von I::iterator_concept durchgeführt, und daher verhält sich std:: counted_iterator < I > manchmal fälschlicherweise so, als ob es dieses Konzept nicht modellieren könnte. Dieses fehlerhafte Verhalten wurde in libstdc++ vor Version 10.4 und in MSVC STL vor VS 2022 17.0 Preview 3 implementiert.

Die Standardbibliothek bietet partielle Spezialisierungen von std::iterator_traits für Zeigertypen, std::counted_iterator , und std::common_iterator an.

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>());
}

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
P2259R1 C++20 es gibt keine Requires-Klausel
pointer wird bedingungslos als void definiert
Constraint hinzugefügt

Siehe auch

bietet eine einheitliche Schnittstelle für die Eigenschaften eines Iterators
(Klassentemplate)