On Tuesday, 6 November 2012 at 23:37:25 UTC, martin wrote:
void func(T)(in auto ref T m);
This template, as I understand it, gets expanded to:
void func(T)(in ref T m); // for lvalues
void func(T)(in T m); // for rvalues
So for non-templated functions, I suggest 2 options:
1) The previously described auto-templates (identical 'auto
ref' semantics), where a function with 'auto ref' parameters is
treated as implicit template. This may lead to code-bloating
(for larger functions) and/or higher performance for rvalue
arguments (rvalues passed to value arguments are moved, not
copied; we therefore gain nothing by passing a reference, but
incur a slight performance hit due to pointer indirection
instead of accessing directly the rvalue on the stack). OR
2) Simple under-the-hood temporary lvalue declaration by the
compiler (for rvalues passed to 'const ref' parameters) - that
would be a handy implementation of the first workaround.
I hope you get my point. :)
What about the case where we want to pass a source argument
either by reference or as a copy depending on the l/r value
situation?
eg
void f( ref a );
void f( a );
--rt