Именованные требования C++: LegacyInputIterator
LegacyInputIterator — это LegacyIterator, который может считывать значение элемента, на который указывает итератор. LegacyInputIterator гарантирует корректность только для алгоритмов однопроходного доступа: после инкрементирования LegacyInputIterator i все копии его предыдущего значения могут стать недействительными.
Требования
| Тип | Определение |
|---|---|
X | Тип входного итератора |
T | Тип значения для X (то есть std::iterator_traits<X>::value_type) |
R | std::iterator_traits<X>::reference |
| Значение | Определение |
i, j | Значения типа X или constX |
r | Значение типа X& |
| Прочее | Определение |
m | Идентификатор, который, возможно, обозначает член данных или функцию-член |
X удовлетворяет требованиям LegacyInputIterator, если выполнены все следующие условия:
-
Xудовлетворяет требованиям LegacyIterator. -
Xудовлетворяет требованиям EqualityComparable. - Следующие выражения корректно сформированы и имеют указанную семантику:
| Выражение | Тип | Семантика | |||||
|---|---|---|---|---|---|---|---|
i != j |
| Предусловие |
i и j принадлежат области ==. |
||||
| Действие | Эквивалентно !(i == j). |
||||||
*i |
R, преобразуемый в T | Предусловие |
i является разыменовываемым. |
||||
| Действие |
|
||||||
i->m | Предусловие |
i является разыменовываемым. |
|||||
| Действие | Эквивалентно (*i).m. |
||||||
++r |
X& | Предусловие |
r является разыменовываемым. |
||||
| Постусловие |
|
||||||
(void)r++ | Действие | Эквивалентно (void)++r. |
|||||
*r++ | преобразуемый в T | Действие | Эквивалентно T x = *r; ++r; return x;. |
||||
Область равенства
Термин область == используется в обычном математическом смысле для обозначения множества значений, которые можно сравнивать с помощью ==. Это множество может изменяться со временем.
Каждый алгоритм задаёт дополнительные требования к области равенства для используемых им значений итераторов. Эти требования можно вывести из того, как алгоритм использует == и !=.
Примечания
Для входного итератора X, который не является LegacyForwardIterator, std::iterator_traits<X>::reference не обязан быть типом ссылки: разыменование входного итератора может возвращать прокси-объект или само значение типа std::iterator_traits<X>::value_type по значению (как в случае с std::istreambuf_iterator).
КонцепцияДля определения
Концепт | (начиная с C++20) |
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 98 | C++98 | возвращаемый тип *i++ должен был быть T | он может быть любым типом, преобразуемым в T |
|
LWG 2114 (P2167R3) | C++98 | преобразуемость в bool была недостаточно строгим требованием, чтобы отражать ожидания реализаций | требования усилены |
См. также
|
(C++20) | задаёт, что тип является входным итератором, то есть его значения можно считывать, а сам итератор поддерживает пре- и постинкремент (концепция) |
| Библиотека итераторов | предоставляет определения итераторов, характеристик итераторов, адаптеров и вспомогательных функций |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/InputIterator