rvalue references

Namespace rswhite4 at googlemail.com
Sun Apr 28 01:43:03 PDT 2013


On Sunday, 28 April 2013 at 00:17:53 UTC, Jonathan M Davis wrote:
> On Saturday, April 27, 2013 13:11:54 Namespace wrote:
>> You often say that 'auto ref' can not work for non-templates.
>
> Please quote at least part of the message that you're replying 
> to. The
> threading of the various clients is often wrong, and I have no 
> way of knowing
> who you're talking to here (and some people don't use threading 
> at all). Based
> on the content, I'm guessing that you're talknig to me, but I 
> really don't
> know.
>
>> Why not really?
>> Because the resulting code bloat is not bearable, or because it
>> is technically not possible?
>
> Because the templated solution involves creating new functions, 
> whereas that's
> not going to work for non-templated functions, particularly 
> when you consider
> .di files and prototypes. It also gets particularly nasty when 
> function
> overriding gets added into the mix. Walter himself has said 
> several times in
> the past that the solution used for auto ref and templates 
> can't work with
> non-templated functions.
>
>> Also I would like to see an answer of my overlooked question
>> (just out of curiosity):
>> http://forum.dlang.org/thread/kl4v8r$tkc$1@digitalmars.com?page=7#post-kyicm
>> dsriwnxqiuzkaho:40forum.dlang.org
>
> So, you're asking why the compiler can't just do a move in the 
> rvalue case and
> pass by ref in the lvalue case for auto ref? The semantics are 
> completely
> different. You need _one_ function, and you can't do that with 
> one function.
> That would be like asking the function to be both
>
> auto foo(int* i) {...}
>
> and
>
> auto foo(int i) {...}
>
> only we're talking about ref rather than pointers (but ref is 
> really a pointer
> underneat the hood). A function can only have one signature 
> unless it's a
> template, and the only way that templates can have more is 
> because they
> generate multiple functions (each with only one signature).
>
> Remember that we're dealing with the C linker here, so we're 
> pretty much
> restricted to what you can ultimately do in C as far as 
> function signatures
> go. We have to do name mangling to do function overloading or 
> add additional
> information to function signatures (such as pure or nothrow), 
> and the only
> information you ultimately have is the function signature, so 
> anything
> requiring messing with how the function works either must be 
> done inside the
> function (where it knows nothing about the caller), or you need 
> multiple
> functions, which generally means templates. To get around all 
> of that, we'd
> need to create our own linker which didn't work like C's linker 
> does, which
> would create its own set of problems.
>
> - Jonathan M Davis

Sorry but you're right I meant you. Thanks for explanation.


More information about the Digitalmars-d mailing list