Subject: Re: [boost] [iterator] reverse_iterator<counting_iterator<T>>
From: Arno Schödl (aschoedl_at_[hidden])
Date: 2010-04-13 09:52:33
"Stewart, Robert" <Robert.Stewart_at_[hidden] <mailto:Robert.Stewart_at_[hidden]> > wrote in message news:DF2E67F3D097004694C8428C70A3FD690470B26B7F_at_[hidden] <news:DF2E67F3D097004694C8428C70A3FD690470B26B7F_at_[hidden]> ...
> this->base() calls iterator_adaptor<>::base(), which returns a reference to the underlying iterator it holds. Passing that reference to boost::prior() means that prior() pre-decrements the iterator within the iterator_adaptor. It would be odd for that
>decrement operator to return anything but a reference to the decremented object, so boost::prior() returns a reference to its decremented argument, a reference to the decremented iterator within the iterator_adaptor.
> I see no problem.
boost::prior(...) internally makes a copy of its iterator argument, decrements it and returns it by value, so far so good. counting_iterator::operator* then returns a reference into this (temporary) iterator. Returning from reverse_iterator::dereference() destroys the temporary iterator, but still returns the reference pointing into it. I overlooked that I already filed a defect a while ago for it:
It would be great to have it fixed, because the bug is quite subtle and may go undetected for a while.
-- Dr. Arno Schoedl · aschoedl_at_[hidden] Technical Director think-cell Software GmbH · Chausseestr. 8/E · 10115 Berlin, Germany http://www.think-cell.com · phone +49 30 666473-10 · toll-free (US) +1 800 891 8091 Directors: Dr. Markus Hannebauer, Dr. Arno Schoedl · Amtsgericht Berlin-Charlottenburg, HRB 85229
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk