Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2003-10-11 16:40:31

Daniel Wallin wrote:
> 1. It operates on containers rather than iterators.

Yes, containers, arrays and null-terminated strings. What is your
objection exactly? If you are saying that iterating over a container is
wrong *in principle*, then I disagree -- it's often exactly what you
want. If you are saying that there should be a way to iterate over a
sub-sequence, then I agree. I just uploaded a new version that lets you
iterate over an iterator range like this:

using boost::for_each::in_range;
BOOST_FOREACH( int i, in_range( iter1, iter2 ) )

> 2. It reevaluates the container expression on every iteration.

True, but the "container expression" must be an lvalue, which makes it
difficult to use incorrectly. The container expression cannot be a
function call that returns a temporary, for instance.

You may be wondering about in_range() above -- it is a function that
returns a temporary, yet it is being used as a container expression.
in_range() returns a special type, and BOOST_FOREACH accepts it even
though it is not an lvalue. However, the *arguments* to in_range() must
be iterator lvalues and not temporaries returned by functions.

I understand your concerns, however. There is still the danger for this:

BOOST_FOREACH( int i, in_range( ++iter1, iter2 ) )
                                 ^^^^^^^ oops!

I'm not sure how to guard against that.

Eric Niebler
Boost Consulting

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