Для входных итераторов приращение итератора делает недействительными копии того же итератора.
Итак:
auto a = istream_iterator<whatever>(something);
auto b = a;
a == b; // true
++a; // b is now invalid
++b; // undefined behavior, I think, but in any case not guaranteed to
// result in anything sensible.
Так что, конечно, ++a == ++b
не гарантируется.То есть a == b
не означает ++a == ++b
.
Я думаю, что «свойство подстановки» означает, что «все, что вы делаете со значением a
, имеет тот же результат, что и то же, что и со значениемb
"или аналогичный - существуют различные варианты подстановки, на которые он может ссылаться, но что-то в этом роде.Я думаю, что в этом контексте это должно означать « позже , делающий то же самое с b
», поскольку, если a == b
и я еще ничего не сделал недействительным, то не имеет значения, какой из a
и b
Я использую, они ссылаются на одну и ту же точку в потоке.Но когда я увеличиваю, мне нужно выбрать один и потерять другой, поэтому сложность с ++a == ++b
.
«Ссылочная прозрачность» означает, что разные объекты независимы, то есть они не являются ссылками / указателями наили псевдонимы друг друга.В сочетании с «свойством замещения» это означает:
Позже?Не существует ранее или позже , поскольку операции не имеют глобальных побочных эффектов.Если вы не можете заменить «позже», тогда вы не можете заменить
Итераторы ввода в одной и той же последовательности обычно ссылаются на одни и те же «фактические данные», такие как дескриптор файла или любой другой объект, который сам содержитизменчивое состояние.Поскольку a
и b
ссылаются на один и тот же дескриптор файла, а их значение зависит от его состояния, у вас нет ссылочной прозрачности.Этот недостаток , почему замена не удалась.
Прямые итераторы обычно также ссылаются на те же базовые данные (как контейнер), но до тех пор, пока вы используете их для чтения,только (и не изменяйте контейнер иначе), они не изменят этому факту, по крайней мере, пока вы не начнете сравнивать адреса возвращаемых значений.Таким образом, они имеют ограниченную ссылочную прозрачность своего собственного значения , чего нет у итераторов ввода.Они по-прежнему ссылаются на себя, поэтому то, на что они ссылаются, все еще носит псевдоним.