www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - what means... auto ref Args args?

reply Dave Jones <dave jones.com> writes:
Poking around in the source code for emplace and I noticed...

T* emplace(T, Args...)(T* chunk, auto ref Args args)

what does the "auto ref" do in this situiation? Cant seem to find 
any explanation in the docs.
Oct 18
next sibling parent Dave Jones <dave jones.com> writes:
On Wednesday, 18 October 2017 at 21:38:41 UTC, Dave Jones wrote:
 Poking around in the source code for emplace and I noticed...

 T* emplace(T, Args...)(T* chunk, auto ref Args args)

 what does the "auto ref" do in this situiation? Cant seem to 
 find any explanation in the docs.
sorry meant to put this in learn
Oct 18
prev sibling parent reply Moritz Maxeiner <moritz ucworks.org> writes:
On Wednesday, 18 October 2017 at 21:38:41 UTC, Dave Jones wrote:
 Poking around in the source code for emplace and I noticed...

 T* emplace(T, Args...)(T* chunk, auto ref Args args)

 what does the "auto ref" do in this situiation? Cant seem to 
 find any explanation in the docs.
It means that any argument (that is an element of args) will be passed by reference if and only if it's an lvalue (has a memory address that can be taken) (it'll be passed by value otherwise). https://dlang.org/spec/template.html#auto-ref-parameters
Oct 18
parent reply Dave Jones <dave jones.com> writes:
On Wednesday, 18 October 2017 at 22:16:32 UTC, Moritz Maxeiner 
wrote:
 On Wednesday, 18 October 2017 at 21:38:41 UTC, Dave Jones wrote:
 Poking around in the source code for emplace and I noticed...

 T* emplace(T, Args...)(T* chunk, auto ref Args args)

 what does the "auto ref" do in this situiation? Cant seem to 
 find any explanation in the docs.
It means that any argument (that is an element of args) will be passed by reference if and only if it's an lvalue (has a memory address that can be taken) (it'll be passed by value otherwise). https://dlang.org/spec/template.html#auto-ref-parameters
So it's just to make sure any "ref" in the eventual call to Ts constructor is also reflected in the call to emplace?
Oct 18
parent reply Jonathan M Davis <newsgroup.d jmdavisprog.com> writes:
On Thursday, October 19, 2017 00:00:54 Dave Jones via Digitalmars-d wrote:
 On Wednesday, 18 October 2017 at 22:16:32 UTC, Moritz Maxeiner

 wrote:
 On Wednesday, 18 October 2017 at 21:38:41 UTC, Dave Jones wrote:
 Poking around in the source code for emplace and I noticed...

 T* emplace(T, Args...)(T* chunk, auto ref Args args)

 what does the "auto ref" do in this situiation? Cant seem to
 find any explanation in the docs.
It means that any argument (that is an element of args) will be passed by reference if and only if it's an lvalue (has a memory address that can be taken) (it'll be passed by value otherwise). https://dlang.org/spec/template.html#auto-ref-parameters
So it's just to make sure any "ref" in the eventual call to Ts constructor is also reflected in the call to emplace?
That's likely the main reason in this case, since losing the ref-ness could definitely cause issues with some constructors, but auto ref is frequently used simply to avoid copying lvalues while not requiring lvalues (since if ref is used, the argument must be an lvalue, and if ref is not used, the argument will be copied if it's an lvalue; it will be moved if it's an rvalue). D never binds rvalues to ref like C++ does with const T&. - Jonathan M Davis
Oct 18
parent Dave Jones <dave jones.com> writes:
On Thursday, 19 October 2017 at 01:05:28 UTC, Jonathan M Davis 
wrote:
 On Thursday, October 19, 2017 00:00:54 Dave Jones via
 That's likely the main reason in this case, since losing the 
 ref-ness could definitely cause issues with some constructors, 
 but auto ref is frequently used simply to avoid copying lvalues 
 while not requiring lvalues (since if ref is used, the argument 
 must be an lvalue, and if ref is not used, the argument will be 
 copied if it's an lvalue; it will be moved if it's an rvalue). 
 D never binds rvalues to ref like C++ does with const T&.

 - Jonathan M Davis
Makes sense, thanks.
Oct 19