Таблица 72 в C ++ 03 о требованиях итератора ввода говорит, что предварительным условием ++r
является то, что r
не может ссылаться. Те же самые предварительные условия выполняются для r++
.
Теперь 24.5.1/1
говорит о istream_iterator
Результат operator*
в конце потока не определен.
В заключение, влияние operator++
на итератор конца потока не определено.
Таблица 72 в C ++ 03 о требованиях к итераторам ввода говорит, что предварительным условием ++r
является то, что r
не может ссылаться. Те же самые предварительные условия выполняются для r++
.
Теперь 24.5.1/1
говорит о istream_iterator
Результат operator*
в конце потока не определен.
В заключение, влияние operator++
на итератор конца потока не определено.
Заметьте, что я думаю, что этот вывод делает поведение неопределенным только тогда, когда вы пишете или используете алгоритм, использующий входные итераторы, которые демонстрируют это поведение, а затем пропускают итератор istream. Только из с использованием явного самого итератора istream, не рассматривая его как входной итератор и полагаясь на его инварианты, я думаю, что приведенный выше вывод не совсем верен (у нас может быть класс, который не требует например, r
разыменовывается).
Но, глядя на то, как описан итератор istream, вызов operator++
после достижения значения конца потока также приводит к неопределенному поведению. operator==
для него определяется как эквивалент
x.in_stream == y.in_stream
Где in_stream
- указатель на поток, перебранный и представленный в стандартном тексте для определения поведения и семантики «только для представления». Теперь единственная реализация, о которой я могу подумать, которая делает эту работу, - это использование итератора конца потока, который хранит в качестве указателя потока нулевой указатель. Но operator++
определяется как выполнение чего-то, что имеет следующий эффект
*in_stream >>value
Теперь, если вы войдете в состояние конца потока, и мы установим для in_stream
нулевой указатель, то, несомненно, результатом этого будет неопределенное поведение.
Таким образом, даже если вы используете только итератор istream, нет никаких гарантий, что вы можете увеличить значение после конца потока.