Именованные требования C++: LegacyForwardIterator
LegacyForwardIterator — это LegacyIterator, который может считывать данные из элемента, на который указывает итератор.
В отличие от LegacyInputIterator и LegacyOutputIterator, его можно использовать в алгоритмах с несколькими проходами.
Если LegacyForwardIterator it происходит из Container, то тип значения it совпадает с типом значения контейнера, поэтому разыменование (*it) возвращает тип значения контейнера.
Требования
| Тип | Определение |
|---|---|
X | Тип итератора прямого прохода |
T | Тип значения X (т. е. std::iterator_traits<X>::value_type) |
Ref | std::iterator_traits<X>::reference |
| Значение | Определение |
i, j | Значения типа X или constX |
r | Значение типа X& |
X удовлетворяет требованиям LegacyForwardIterator, если выполняются все следующие условия:
-
Xудовлетворяет требованиям LegacyInputIterator. -
Xудовлетворяет требованиям DefaultConstructible. - Если
Xявляется изменяемым итератором,Refявляется ссылкой наT. - Если
Xявляется константным итератором,Refявляется ссылкой на constT. - Объекты типа
Xобеспечивают гарантию многопроходности. - Если
iиjравны, то либо обаiиjявляются разыменовываемыми, либо ни один из них не является разыменовываемым. - Если
iиjоба являются разыменовываемыми, тоi == jтогда и только тогда, когда*iи*jсвязаны с одним и тем же объектом. - Следующие выражения должны быть корректными и иметь указанные эффекты:
| Выражение | Тип | Эффекты |
|---|---|---|
r++ | преобразуемый в constX& | Эквивалентно X x = r;++r;return x;. |
*i++ |
Ref |
Область равенства
Область == для итераторов прямого прохода — это область итераторов, проходящих по одной и той же последовательности.
| Однако итераторы прямого прохода, инициализированные значением, можно сравнивать; они должны быть равны другим итераторам того же типа, инициализированным значением. Иными словами, итераторы прямого прохода, инициализированные значением, ведут себя так, как если бы они указывали за конец одной и той же пустой последовательности. | (начиная с C++14) |
Гарантия многопроходности
Два разыменовываемых итератора a и b типа X обеспечивают гарантию многопроходности, если выполняются все следующие условия:
-
a == bвлечёт++a == ++b. - Выполняется одно из следующих условий:
-
Xявляется типом указателя. - Выражение
(void)++X(a), *aэквивалентно выражению*a.
КонцептДля определения
Концепт | (начиная с C++20) |
Примечания
В отличие от концепта std::forward_iterator, требования LegacyForwardIterator требуют, чтобы разыменование возвращало ссылку.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
|
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 является итератором прямого прохода, поддерживающим сравнение на равенство и многопроходность (концепт) |
| Библиотека итераторов | предоставляет определения итераторов, характеристик итераторов, адаптеров и вспомогательных функций |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/ForwardIterator