Spec-Zone.ru › C++

std::iterator_traits<std::counted_iterator>

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

Условие в require-клаузе является 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 нет require-клаузы
pointer безусловно определено как void
добавлено ограничение

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/counted_iterator/iterator_traits

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API