On 27 April 2013 05:31, Jonathan M Davis <jmdavisProg@gmx.com> wrote:
On Friday, April 26, 2013 14:15:07 Manu wrote:
> > I mean is that the way that auto ref should work with non-templated
> > functions
> > is that
> >
> > auto foo(auto ref T param) {...}
> >
> > becomes
> >
> > auto foo(ref T param) {...}
> >
> > underneath the hood. Then when you pass an rvalue to it - e.g. foo(T(5)) -
> > that gets translated to something like
> >
> > T __temp = T(5);
> > foo(__temp);
> >
> > Then auto ref works with both lvalues and rvalues with only one function
> > definition, and ref is unchanged in how it works (it still only accepts
> > lvalues).
>
> Why bother with 'auto'? Why not just make this default behaviour?

For the same reason that T& doesn't take rvalues in C++ while const T& does.
There's a big difference between wanting an argument to be passed as efficiently
as possible and specifically wanting to alter the argument being passed in.
Plain ref is for cases where you explicitly want to mutate the argument.
You're just asking for bugs if you allow ref to accept rvalues. We've had
problems like this before when some literals were treated as lvalues. The
behavior of a function which takes its argument by ref and the behavior of one
which takes its argument by auto ref are fundamentally different.

So you're saying it should be const ref instead of auto ref...
I agree.