std:: iterator_traits <std::counted_iterator>
| Iterator concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iterator primitives | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Algorithm concepts and utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Indirect callable concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Common algorithm requirements | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iterator adaptors | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Non-member functions | ||||
|
(C++20)
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
| Helper classes | ||||
|
iterator_traits
<std::counted_iterator>
(C++20)
|
|
Определено в заголовочном файле
<iterator>
|
||
|
template
<
std::
input_iterator
I
>
requires
/* см. ниже */
|
(начиная с 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
|
добавлено ограничение |
Смотрите также
|
предоставляет унифицированный интерфейс к свойствам итератора
(шаблон класса) |