Boost logo

Boost :

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:

 

https://svn.boost.org/trac/boost/ticket/2640 <https://svn.boost.org/trac/boost/ticket/2640>

 

It would be great to have it fixed, because the bug is quite subtle and may go undetected for a while.

 

Arno

 

--
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