27 Iterators library [iterators]

27.2 Iterator requirements [iterator.requirements]

27.2.5 Forward iterators [forward.iterators]

Тип класса или указателя X удовлетворяет требованиям прямого итератора, если

  • X удовлетворяет требованиям input iterator,

  • X удовлетворяет DefaultConstructible requirements,

  • если X изменяемый итератор, reference это ссылка на T; если X постоянный итератор, reference это ссылка на const T,

  • выражения в таблице 97 действительны и имеют указанную семантику, и

  • объекты типа X предлагают многопроходную гарантию, описанную ниже.

Область == прямых итераторов - это область итераторов той же базовой последовательности. Однако итераторы с инициализацией значения могут сравниваться и должны сравниваться наравне с другими итераторами с инициализацией значения того же типа. [ Note: Итераторы с инициализацией значения ведут себя так, как если бы они ссылались на конец одной и той же пустой последовательности. ] end note

Два разыменяемых итератора a и b типа X предлагают multi-pass guarantee if:

  • a == b подразумевает ++a == ++b и

  • X является типом указателя или выражение (void)++X(a), *a эквивалентно выражению *a.

[ Note: Требование, которое a == b подразумевает ++a == ++b (что неверно для итераторов ввода и вывода) и снятие ограничений на количество назначений через изменяемый итератор (которое применяется к итераторам вывода), позволяет использовать многопроходные однонаправленные алгоритмы с прямыми итераторами. ]end note

Таблица 97 - Требования прямого итератора (в дополнение к итератору ввода)
ВыражениеТип возвратаОперативныйУтверждение / примечание
семантикадо / после состояния
r++ конвертируемый в const X& { X tmp = r;
++r;
return tmp; }
*r++ reference

Если a и b равны, то либо a и, либо b разыменуемы, либо ни один из них не разыменован.

Если a и b оба разыменованы, то a == b тогда и только тогда, когда *a и *b привязаны к одному и тому же объекту.