X u(a); | - | - | после: u - копия a. |
u = a | X& | - | после: u - копия a. |
a == b | обратимый в bool | - | если a - копия b, тогда a == b возвращает true. == - это отношение эквивалентности в области действия ==. |
a!= b | обратимый в bool | !(a == b) | - |
*a | обратимый в T | - | до: a - разыменовываемое. если a - копия b, то *a эквивалентно *b. |
++r | X& | - | до: r - разыменовываемое. после: r - разыменовываемое или r - законечное. |
void r++ | void | void ++r | - |
*r++ | Т | {X tmp = r; ++r; return tmp;} | - |
ПРИМЕЧАНИЕ. Для итераторов ввода нет никаких требований на тип или значение r++ кроме требования, чтобы *r++ работал соответственным образом. В частности, r == s не подразумевает, что ++r == ++s. (Равенство не гарантирует свойство замены или ссылочной прозрачности.) Что касается ++r, то нет больше никаких требований на значения любых копий r за исключением того, что они могут быть безопасно уничтожены или присвоены. После выполнения ++r не требуется, чтобы были копии (предыдущего) r в области ==. Алгоритмы с итераторами ввода никогда не должны пытаться проходить через тот же самый итератор дважды. Они должны быть
Итераторы вывода (Output iterators)
Класс или встроенный тип X удовлетворяет требованиям итератора вывода, если справедливы следующие выражения:
Таблица 3. Требования итератора вывода
выражение | возвращаемый тип | семантика исполнения | утверждение/примечание состояние до/после |
---|---|---|---|
X(a) | - | - | *a = t эквивалентно *X(a) = t. примечание: предполагается деструктор. |
X u(a); | - | - | - |
*a = t | результат не используется | - | - |
++r | X& |