http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46906
--- Comment #7 from Marc Glisse <marc.glisse at normalesup dot org> 2011-09-05 12:38:13 UTC --- (In reply to comment #6) > 1) The fact that repeated calls of operator* without intervening operator++ > calls produce the same result for a given iterator object is required by > expression *a: > > "The expression (void)*a, *a is equivalent to *a." There are operations between the 2 calls to operator*. > This explains the repeated values '1' and '1' from it1 and '2' and '2' from > it2. Oh, are you saying that this rule has priority over the one that says that operator* just forwards to sgetc? That would actually require istreambuf_iterator to keep the last value in cache the way libstdc++ does. If that's the case, I believe it would be worth mentioning in the standard (it's not just me, when I filed the bug report I had found at least one implementation that did not cache, Roguewave (haven't checked more recent Apache versions)). For a vector, touching the vector between 2 dereferencing of the same iterator invalidates the iterator. Here, my guess was that it didn't invalidate the iterator and we should blindly call sgetc. But your explanation makes sense.