・istream_iteratorはコンストラクト時に自身をインクリメントする。(stream >> dataを呼ぶ。つまりシーク位置が変更される。)
・対してistreambuf_iteratorはコンストラクト時には何もしない。(シーク位置は変わらない。)
istream_iteratorはインクリメントされる時にストリームから読みだすのでoperator*で複数回読めるように値を保持する設計になっている。コンストラクト時には返す値がまだ無いため必ず読んでおかなければならない。istreambuf_iteratorはstreambuf::sgetcがあるのでいつでも現在の位置の文字を読めるためキャッシュする必要がない。
ソースを読めば一発でわかるけど知らないと嵌りそう。
そもそもistream_iteratorを使うなということですね。はい。