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)
Определено в заголовочном файле <iterator>
template < std:: input_iterator I >

requires /* см. ниже */
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 > ;

} ;
(начиная с C++20)

Наследует свойства от пользовательской (сгенерированной либо из стандартной частичной специализации, либо из программно-определенной специализации) std:: iterator_traits < I > , с скорректированным типом-членом pointer , где I моделирует input_iterator .

Важно отметить, что iterator_concept (если присутствует) и iterator_category наследуются от std:: iterator_traits < I > .

Условие в requires-клаузе является true тогда и только тогда, когда std:: iterator_traits < I > не генерируется из первичного шаблона.

Содержание

Примечание

До P2259R1 эта специализация использовалась даже если std:: iterator_traits < I > генерируется из основной шаблонной специализации. В результате при проверке std:: counted_iterator < I > на соответствие концепту итератора (например, forward_iterator ) определение /*ITER_CONCEPT*/ не учитывает I::iterator_concept , и поэтому std:: counted_iterator < I > иногда ошибочно ведет себя так, как если бы он не может моделировать эту концепцию. Данное некорректное поведение реализовано в libstdc++ до версии 10.4 и в MSVC STL до VS 2022 17.0 Preview 3.

Стандартная библиотека предоставляет частичные специализации для std::iterator_traits указательных типов, std::counted_iterator и std::common_iterator .

Пример

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

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
P2259R1 C++20 отсутствует requires-клауза
pointer безусловно определяется как void
добавлено ограничение

Смотрите также

предоставляет унифицированный интерфейс к свойствам итератора
(шаблон класса)