Boost logo

Boost :

Subject: Re: [boost] [Foreach] Supporting range adaptors for temporary containers
From: Jeffrey Lee Hellrung, Jr. (jeffrey.hellrung_at_[hidden])
Date: 2011-04-21 19:01:21


On Thu, Apr 21, 2011 at 3:43 PM, Michel MORIN <mimomorin_at_[hidden]> wrote:

> Jeffrey Lee Hellrung, Jr. wrote:
> > On Thu, Apr 21, 2011 at 1:07 PM, Michel MORIN <mimomorin_at_[hidden]>
> wrote:
> >
> >> Sometimes it is convenient to apply range adaptors to a temporary
> container
> >> and iterate over it:
> >>
> >> // `using namespace boost::adaptors;` is assumed
> >> BOOST_FOREACH(auto x, std::string("Hello, world!") | reversed) {...}
> >>
> >> However, the lifetime of the temporary container ends before the loop
> body
> >> begins.
> >
> > I believe BOOST_FOREACH correctly accounts for rvalue range expressions.
> > See second-to-last example from
> >
> > http://www.boost.org/doc/libs/1_46_1/doc/html/foreach.html
> >
> > Does this address your concern?
>
> No.
>
> extern std::vector<float> get_vector_float();
> BOOST_FOREACH( float f, get_vector_float() )
> {
> ...
> }
>
> This code is OK. A temporary range returned by `get_vector_float()` is
> copied. In C++0x range-based for, the temporary range is bound to an
> rvalue reference and its lifetime is extended.
>
> extern std::vector<float> get_vector_float();
> BOOST_FOREACH( float f, get_vector_float() | reversed )
> {
> ...
> }
>
> But this code results in a dangling reference. ONLY a temporary
> iterator_range returned by `get_vector_float() | reversed` is
> copied (or bound to an rvalue reference in C++0x range-based for).
> The lifetime of `get_vector_float()` ends before the loop body begins!
>

Ah, right. I didn't read your original msg closely enough, apparently.
Sounds like a legitimate use case...

- Jeff


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk