Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
October 18, 2017 what means... auto ref Args args? | ||||
---|---|---|---|---|
| ||||
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 Re: what means... auto ref Args args? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dave Jones | 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 Re: what means... auto ref Args args? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dave Jones | 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 Re: what means... auto ref Args args? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Moritz Maxeiner | 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 Re: what means... auto ref Args args? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dave Jones | 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 Re: what means... auto ref Args args? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | 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. |
Copyright © 1999-2021 by the D Language Foundation