C++ named requirements: LegacyForwardIterator
LegacyForwardIterator — это LegacyIterator , который может читать данные из указываемого элемента.
В отличие от LegacyInputIterator и LegacyOutputIterator , его можно использовать в многопроходных алгоритмах.
Если LegacyForwardIterator it происходит из Container , то его тип значения совпадает с типом значения контейнера, поэтому разыменование ( * it ) дает тип значения контейнера.
Содержание |
Требования
| Тип | Определение |
X
|
Тип прямого итератора |
T
|
Тип значения
для
X
(т.е.
std::
iterator_traits
<
X
>
::
value_type
)
|
Ref
|
std:: iterator_traits < X > :: reference |
| Значение | Определение |
| i , j |
Значения типа
X
или
const
X
|
| r |
Значение типа
X&
|
X
удовлетворяет требованиям
LegacyForwardIterator
если выполняются все следующие условия:
-
Xудовлетворяет требованиям LegacyInputIterator . -
Xудовлетворяет требованиям DefaultConstructible . -
Если
Xявляется изменяемым итератором ,Refпредставляет собой ссылку наT. -
Если
Xявляется константным итератором,Refпредставляет собой ссылку на const T . -
Объекты типа
Xобеспечивают гарантию многопроходности . - Если i и j равны, то либо оба i и j являются разыменуемыми , либо ни один из них не является разыменуемым.
- Если i и j оба разыменуемы, то i == j тогда и только тогда, когда * i и * j связаны с одним и тем же объектом.
- Следующие выражения должны быть корректными и иметь указанные эффекты:
| Выражение | Тип | Эффекты |
|---|---|---|
| r ++ | преобразуемо в const X & |
Эквивалентно
X x
=
r
;
++ r ; return x ; . |
| * i ++ |
Ref
|
Домен равенства
Область определения для == для forward итераторов — это итераторы над одной и той же базовой последовательностью .
|
Однако, value-initialized forward iterators могут быть сравнены и должны быть равны другим value-initialized итераторам того же типа. Другими словами, value-initialized forward iterators ведут себя так, как если бы они указывали за конец той же пустой последовательности. |
(since C++14) |
Гарантия многопроходности
Два разыменуемых итератора
a
и
b
типа
X
обеспечивают
гарантию многопроходности
при выполнении всех следующих условий:
- a == b подразумевает ++ a == ++ b .
- Выполняется любое из следующих условий:
-
-
Xявляется типом указателя. - Выражение ( void ) ++ X ( a ) , * a эквивалентно выражению * a .
-
КонцептДля определения std::iterator_traits определяется следующий концепт, используемый только для демонстрации.
где концепт, используемый только для демонстрации,
|
(начиная с C++20) |
Примечания
В отличие от концепции std::forward_iterator , требования LegacyForwardIterator обязывают разыменование возвращать ссылку.
Отчёты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
|
LWG 1212
( N3066 ) |
C++98 |
тип выражения
*
i
++
не соответствовал типу
* i -- требуемому LegacyBidirectionalIterator |
изменен
тип на
Ref
|
|
LWG 1311
( N3066 ) |
C++98 |
«
a
==
b
подразумевает
++
a
==
++
b
» само по себе
не гарантировало многопроходность [1] |
также требует «
a
==
b
подразумевает ++ a ! = b » [2] |
| LWG 3798 | C++20 |
__LegacyForwardIterator
требовал
std:: iter_reference_t < It > быть ссылочным типом lvalue |
также разрешает
ссылочные типы rvalue |
- ↑ В сценарии, где a и b используют один и тот же базовый итератор, вычисление выражения ++ a == ++ b фактически дважды инкрементирует базовый контейнер, но результат всё равно равен true .
- ↑ Формально также требует подразумевать ++ b ! = a .
Смотрите также
|
(C++20)
|
определяет, что
input_iterator
является прямым итератором, поддерживающим сравнение на равенство и многопроходность
(концепт) |
| Библиотека итераторов | предоставляет определения для итераторов, характеристик итераторов, адаптеров и служебных функций |