Boost logo

Boost :

From: John Max Skaller (skaller_at_[hidden])
Date: 2001-08-07 15:51:52

Corwin Joy wrote:

> > It doesn't matter what the Standard says about it:
> > you can deduce that
> >
> > i,j forward and output implies &*i == &*j
> >
> > provided the RHS is well defined AND i,j are non-const lvalues.
> Can you give a more rigorous proof of this.

        No, but I think can give a counter example :-(

        struct caching_iterator<class Iterator>
                Iterator i;
                static bool flag;
                static typename Iterator::value_type vcache[2];
                static Iterator icache;
                typename Iterator::value_type &operator*(){
                        *(icache)=vcache[flag]; // write cache
                        flag = !flag;
                        return vcache[flag];

Here, i==j iff i.i == j.i, ++i means ++i.i etc.
But * alternates between two caches, globally so:

        assert(i==i); // == must be equivalence relation!
        assert(&*i != &*i); //!!!!

Here &*i is not equal to itself, but *i is always equal to *j when i==j.

        The class above is probably? a conforming
iterator (adaptor). It works by delaying the write operation,
and writing to the container _every_ access. Yet there are two locations
with different addresses that always hold the correct value when you
look at them -- although the container itself is one access out of date.

If this is conforming, we've got problems, because direct operations
on the container will not work as expected: you'd be surprised if

        p = a + i;
        *p = 10;
        cout << a[i]

printed something other than 10? Of course, we could have
a container that ONLY provided iterator based operations,
and used this kind of caching iterator.

John (Max) Skaller, mailto:skaller_at_[hidden] 
10/1 Toxteth Rd Glebe NSW 2037 Australia voice: 61-2-9660-0850
New generation programming language Felix
Literate Programming tool Interscript

Boost list run by bdawes at, gregod at, cpdaniel at, john at