
On Thu, Apr 21, 2011 at 3:43 PM, Michel MORIN <mimomorin@gmail.com> wrote:
On Thu, Apr 21, 2011 at 1:07 PM, Michel MORIN <mimomorin@gmail.com> 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
Jeffrey Lee Hellrung, Jr. wrote: 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