Идея потока состоит в том, чтобы читать некоторые данные из него последовательно, каждый раз, продвигая внутренний указатель. Продвигая этот указатель, вы меняете объект потока. Вы не можете читать из const
потоков (если только вы не указали const
), но вы этого не должны делать).
EDIT: На самом деле нам все равно, если фактический объект потока, скрытый за интерфейсом istream
, использует некоторые «внутренние указатели» или нет. Чтобы быть точным, важно то, что поток изменяет свое состояние, когда вы его читаете, потому что в следующий раз, когда вы его прочитаете, вы получите другой результат (вы читаете следующее из потока). И если вы получили объект const
, это означает, что вы не должны изменять его состояние.
Также есть причина, по которой вы не можете просто получить данные из потока и ничего не менять. В случае файловых потоков следующее, что вы хотите прочитать из потока, возможно, даже не в памяти, потоковый объект может сначала прочитать его с диска, обновить его буферы и т. Д. (EDIT: Но это не меняет внешне видимого состояния объекта, так что на самом деле это не очень хороший аргумент. Читайте о ключе mutable
, чтобы узнать больше.)
Он читает строку из потока, поэтому он меняет свое состояние. – juanchopanza