On Tuesday, April 23, 2013 14:58:50 Andrei Alexandrescu wrote:
> On 4/23/13 2:45 PM, Namespace wrote:
> >> auto ref is needed to accept rvalues.
> > 
> > I'm curious as to when that is implemented. Or if I purely watch here
> > again in a year and the issue still exists. :)
> 
> It is implemented, but currently only for templates.

I think that the obvious thing to do for auto ref and non-templates is to just 
make it so that underneath the hood it's ref, and if you pass an rvalue to it, 
a variable is created on the stack (presumably for the lifetime of the 
statement that the function call is in) and passed to the function (so then 
it's an lvalue as ref requires).

However, the problem with simply making auto ref do this for non-templated 
functions is that then it functions fundamentally differently for templated and 
non-templated functions. And we can't change auto ref to work that way for 
templated functions, because auto ref's current behavior has proven useful for 
forwarding the refness of an argument (which auto won't do on its own), which 
improves D's forwarding capabilities. But given the combinatorial explosion of 
template instantiations if you have many auto ref variables for a templated 
function, most uses of auto ref with templated functions really should be 
using what I just described for non-templated functions. But to allow both 
behaviors, we pretty much need a new attribute. And if we're using a new 
attribute, we either need to make it do what auto ref currently does for 
templates (and therefore change auto ref to do the new thing and break some 
amount of code out there), or we need to make the new attribute do the new 
thing and never implement auto ref for non-templated functions.

So, probably the best route at this point is to come up with a new attribute 
which is replace with ref in the function definition and transparently creates 
variables for rvalues so that they can be passed to the function as lvalues, 
and then that attribute works with both templated and non-templated functions. 
But it _is_ kind of annoying to not be able to use auto ref for that given 
that that's basically what it was intended for in the first place.

Maybe I'm missing something here, but that's how the situation seems to me.

- Jonathan M Davis

Reply via email to