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)
Definido en el encabezado <iterator>
template < std:: input_iterator I >

requires /* ver más abajo */
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 > ;

} ;
(desde C++20)

Hereda las propiedades de una especialización personalizada (generada a partir de una especialización parcial estándar o una especialización definida por programa) std:: iterator_traits < I > , con el tipo miembro pointer ajustado, donde I modela input_iterator .

Cabe destacar que el iterator_concept (si está presente) y el iterator_category se heredan de std:: iterator_traits < I > .

La condición en la cláusula requires es true si y solo si std:: iterator_traits < I > no se genera desde la plantilla principal.

Contenidos

Nota

Antes de P2259R1 , esta especialización se utilizaba incluso si std:: iterator_traits < I > se generaba desde la plantilla primaria. Como resultado, al evaluar std:: counted_iterator < I > contra un concepto de iterador (por ejemplo, forward_iterator ), la determinación de /*ITER_CONCEPT*/ no tomaba en cuenta I::iterator_concept , y por lo tanto std:: counted_iterator < I > a veces se comportaba erróneamente como si no pudiera modelar ese concepto. Este comportamiento incorrecto se implementó en libstdc++ anterior a 10.4, y en MSVC STL anterior a VS 2022 17.0 Preview 3.

La biblioteca estándar proporciona especializaciones parciales de std::iterator_traits para tipos de puntero, std::counted_iterator , y std::common_iterator .

Ejemplo

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
P2259R1 C++20 no hay cláusula requires
pointer se define incondicionalmente como void
restricción añadida

Véase también

proporciona una interfaz uniforme para las propiedades de un iterador
(class template)