Книга верна;и противоречивые источники не являются.Как представляется, не существует правила, запрещающего чтение объекта более одного раза путем косвенного ввода через входной итератор.
Другие источники могут быть сбиты с толку другим аналогичным ограничением, заключающимся в том, что после увеличения входного итератора все копиипредыдущий итератор признан недействительным и, следовательно, больше не может быть перенаправлен.Это ограничение разделяют выходные итераторы.Например:
value = *inputIt;
value = *inputIt; // OK
copyIt = inputIt;
++inputIt;
value = *copyIt; // Not OK
В книге также верно, что итератор вывода имеет ограничение:
*outputIt = value;
++outputIt;
*outputIt = value; // OK
*outputIt = value; // Not OK
Я всегда думал, что итератор ввода и вывода полностью противоположендруг друга.
Многие выходные итераторы также являются входными итераторами, поэтому «противоположность» не совсем описательна.Они частично перекрывают наборы требований.Итератор может удовлетворить оба набора требований.
Если у нас есть * outputIt = 1;тогда * outputIt = 2;Разве мы не назначаем один и тот же * выход дважды?
Да;И это то, что выходные итераторы не обязаны поддерживать.
Рассмотрим, например, выходной итератор, который отправляет пакеты через Интернет.Вы написали пакет, и он был отправлен в Интернет и получен на другой машине.Вы не можете путешествовать во времени и решить, что отправленный пакет является чем-то другим.Вы должны перейти к следующему пакету и отправить его вместо этого.