Namespaces
Variants

C++ named requirements: LegacyInputIterator

From cppreference.net
C++ named requirements

LegacyInputIterator — это LegacyIterator , который может читать данные из указываемого элемента. LegacyInputIterator гарантирует корректность только для алгоритмов однократного прохода: после того как LegacyInputIterator i был инкрементирован, все копии его предыдущего значения могут стать невалидными.

Содержание

Требования

Тип Определение
X Тип входного итератора
T Тип значения для X (т.е. std:: iterator_traits < X > :: value_type )
R std:: iterator_traits < X > :: reference
Значение Определение
i , j Значения типа X или const X
r Значение типа X&
Другое Определение
m Идентификатор, который может обозначать член данных или функцию-член


X удовлетворяет требованиям LegacyInputIterator если выполняются все следующие условия:

  • X удовлетворяет требованиям LegacyIterator .
  • X удовлетворяет требованиям EqualityComparable .
  • Следующие выражения являются корректными и имеют указанную семантику:
Выражение Тип Семантика
i ! = j
тип, удовлетворяющий BooleanTestable (до C++20)
тип, моделирующий boolean-testable (начиная с C++20)
Предусловие i и j находятся в области определения оператора == .
Эффект Эквивалентно ! ( i == j ) .
* i R , преобразуемый в T Предусловие i является разыменовываемым .
Эффект
  • Выражение ( void ) * i, * i эквивалентно * i .
  • Если i и j находятся в области определения == , и i == j , то * i эквивалентно * j .
i - > m Предусловие i является разыменовываемым.
Эффект Эквивалентно ( * i ) . m .
++ r X& Предусловие r является разыменовываемым.
Постусловие
  • r является разыменовываемым или r является конечным итератором.
  • Любые копии предыдущего значения 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 ).

Концепт

Для определения std::iterator_traits определяется следующий демонстрационный концепт.

template < class I >

concept __LegacyInputIterator =
__LegacyIterator < I > && std:: equality_comparable < I > && requires ( I i )
{
typename std:: incrementable_traits < I > :: difference_type ;
typename std:: indirectly_readable_traits < I > :: value_type ;
typename std:: common_reference_t < std:: iter_reference_t < I > && ,
typename std:: indirectly_readable_traits < I > :: value_type & > ;
* i ++ ;
typename std:: common_reference_t < decltype ( * i ++ ) && ,
typename std:: indirectly_readable_traits < I > :: value_type & > ;
requires std:: signed_integral < typename std:: incrementable_traits < I > :: difference_type > ;

} ;

где демонстрационный концепт __LegacyIterator описан в LegacyIterator .

(начиная с C++20)

Отчёты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 98 C++98 the return type of * i ++ was required to be T it can be any type convertible to T
LWG 2114
( P2167R3 )
C++98 convertibility to bool was too weak to
reflect the expectation of implementations
requirements strengthened

Смотрите также

определяет, что тип является итератором ввода, то есть его указываемые значения могут быть прочитаны и он может быть как пре-, так и постинкрементирован
(концепт)
Библиотека итераторов предоставляет определения для итераторов, характеристик итераторов, адаптеров и служебных функций