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 | добавлено ограничение |
См. также
| предоставляет единый интерфейс к свойствам итератора (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/counted_iterator/iterator_traits