On Saturday, December 29, 2012 19:43:36 Minas Mina wrote: > So when it will be fixed I will be able to write: > > void foo(auto ref Vector3 v); > > and it will pass copies or references depending on the situation?
For templated functions, it currently generates either void foo(ref Vector3 v); or void foo(Vector3 v); depending on whether you pass it an lvalue or an rvalue. The situtation with non-templated functions has not been sorted out yet, but what will probably happen once it has been is that if you declare void foo(auto ref Vector3 v); then underneath the hood, you'll only get void foo(ref Vector3 v); but when it's passed an rvalue, it will get automatically assigned to a local variable first and then that local variable will leave scope after the function call. So, foo(bar()); will turn into something like auto _temp = bar(); foo(_temp); In either case, the idea is that if you declare a parameter to be auto ref, it will accept both rvalues and lvalues and do so without making unnecessary copies, whereas ref will still specifically require an lvalue. So, you use ref when you want to mutate the original, and you use auto ref when you don't care whether it gets mutated or not but don't want a copy to be made if it doesn't have to be (and you use auto ref const if you want to avoid the copy but guarantee that it doesn't get mutated). - Jonathan M Davis