
On 3/22/2012 2:54 PM, Arno Schödl wrote:
Hello,
What you want to do instead is to change the signature of your function to accept both lvalue and rvalue reference:
template<typename Range> void modifies_range(Range&& rng);
So do we want to change boost::sort( Rng& ) to boost::sort( Rng&& ) ? That would make boost::sort( std::vector() ) ok. C++ decided at some point to disallow binding rvalues to lvalue&. I think the reason is that rvalues are inaccessible for the caller, so modifying them is likely a bug. I am a bit hesitant to throw that out the window for ranges.
Well, its quite often /not/ a bug at all: boost::push_back( a_vector, boost::sort( get_values() ) ); is entirely sensible. And once we get r-value references thoughout the range lib, we can move the elements all the way into the vector (so its optimally efficient and elegant to boot). -Thorsten