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)
Défini dans l'en-tête <iterator>
template < std:: input_iterator I >

requires /* voir ci-dessous */
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 > ;

} ;
(depuis C++20)

Hérite des propriétés de la spécialisation personnalisée (générée soit à partir d'une spécialisation partielle standard, soit d'une spécialisation définie par le programme) std:: iterator_traits < I > , avec le type membre pointer ajusté, où I modélise input_iterator .

Notamment, le iterator_concept (s'il est présent) et le iterator_category sont hérités de std:: iterator_traits < I > .

La condition dans la clause requires est true si et seulement si std:: iterator_traits < I > n'est pas généré à partir du modèle primaire.

Table des matières

Remarque

Avant P2259R1 , cette spécialisation était utilisée même si std:: iterator_traits < I > est générée à partir du modèle primaire. Par conséquent, lors du test de std:: counted_iterator < I > par rapport à un concept d'itérateur (par exemple forward_iterator ), la détermination de /*ITER_CONCEPT*/ ne prend pas en compte I::iterator_concept , et donc std:: counted_iterator < I > se comporte parfois de manière erronée comme s'il ne pouvait pas modéliser ce concept. Ce comportement incorrect est implémenté dans libstdc++ avant la version 10.4, et dans MSVC STL avant VS 2022 17.0 Preview 3.

La bibliothèque standard fournit des spécialisations partielles de std::iterator_traits pour les types pointeurs, std::counted_iterator , et std::common_iterator .

Exemple

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
P2259R1 C++20 il n'y a pas de clause requires
pointer est défini inconditionnellement comme void
contrainte ajoutée

Voir aussi

fournit une interface uniforme pour les propriétés d'un itérateur
(modèle de classe)