Почему последовательные объекты istream_iter увеличивают итеративный поток? - PullRequest
3 голосов
/ 22 апреля 2020

Почему следующий код выводит c?

// main.cpp
#include <iostream>
#include <sstream>
#include <iterator>

int main( int argc, char* argv[] )
{
  std::string p( "abcdefghijklmnopqrstuvwxyz" );
  std::stringstream ss(p);
  std::istream_iterator<char> i( ss );
  std::istream_iterator<char> j( ss );
  std::istream_iterator<char> k( ss );
  std::cout << *k << std::endl;

  return 0;
}

.

$ g++ --version
g++ (GCC) 9.2.1 20190827 (Red Hat 9.2.1-1)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -g ./main.cpp && ./a.out
c

Это похоже на то, что каждый последующий экземпляр istream_iterator неявно повторяет «что-то внутреннее» для stringstream. Почему каждый экземпляр istream_iterator не запускается в начале своего istream_type?

1 Ответ

3 голосов
/ 22 апреля 2020

Да, конструктор istream_iterator выполняет чтение, а i, j, k используют один и тот же поток, поэтому они интерактивны.

(выделение mine)

3) Инициализирует итератор, сохраняет адрес потока в элементе данных, а выполняет первое чтение из входного потока, чтобы инициализировать элемент данных кэшированного значения .

...