Thread overview
what means... auto ref Args args?
Oct 18, 2017
Dave Jones
Oct 18, 2017
Dave Jones
Oct 18, 2017
Moritz Maxeiner
Oct 19, 2017
Dave Jones
Oct 19, 2017
Jonathan M Davis
Oct 19, 2017
Dave Jones
October 18, 2017
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.
October 18, 2017
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
October 18, 2017
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
October 19, 2017
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?


October 18, 2017
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

October 19, 2017
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.