Title
'equivalence' for input iterators
Status
nad
Section
[input.iterators]
Submitter
Corwin Joy

Created on 2002-12-11.00:00:00 last changed 163 months ago

Messages

Date: 2010-10-21.18:28:33

Rationale:

The two iterators aer not in the domain of ==

Date: 2002-12-11.00:00:00

In section [input.iterators] table 72 - 'Input Iterator Requirements' we have as a postcondition of *a: "If a==b and (a, b) is in the domain of == then *a is equivalent to *b".

In section [istreambuf.iterator::equal] it states that "istreambuf_iterator::equal returns true if and only if both iterators are at end-of-stream, or neither is at end-of-stream, regardless of what streambuf object they use." (My emphasis).

The defect is that either 'equivalent' needs to be more precisely defined or the conditions for equality in [istreambuf.iterator::equal] are incorrect. (Or both).

Consider the following example:

   #include <iostream>
   #include <fstream>
   #include <iterator>
   using namespace std;

   int main() {
    ifstream file1("file1.txt"), file2("file2.txt");
    istreambuf_iterator<char> f1(file1), f2(file2);
    cout << "f1 == f2 : " << boolalpha << (f1 == f2) << endl;
    cout << "f1 = " << *f1 << endl;
    cout << "f2 = " << *f2 << endl;
    return 0;
   }

Now assuming that neither f1 or f2 are at the end-of-stream then f1 == f2 by [istreambuf.iterator::equal].

However, it is unlikely that *f1 will give the same value as *f2 except by accident.

So what does *f1 'equivalent' to *f2 mean? I think the standard should be clearer on this point, or at least be explicit that this does not mean that *f1 and *f2 are required to have the same value in the case of input iterators.

History
Date User Action Args
2010-10-21 18:28:33adminsetmessages: + msg2461
2002-12-11 00:00:00admincreate