Binding rvalues to const ref in D

Ethan Watson via Digitalmars-d digitalmars-d at puremagic.com
Thu Oct 20 03:16:00 PDT 2016


On Wednesday, 19 October 2016 at 21:19:03 UTC, Atila Neves wrote:
> On Wednesday, 19 October 2016 at 15:58:23 UTC, Chris Wright 
> wrote:
>> So it seems like the compiler could take care of this by only 
>> providing lvalue references but automatically creating those 
>> temporary variables for me. It's going to create an extra copy 
>> that might not be needed if there were a special rvalue 
>> reference type modifier, but why should I care? It's exactly 
>> as efficient as the code the compiler forces me to write.
>>
>> This is what Ethan Watson has suggested, too.
>
> Interesting. Also, I must have missed that suggestion.

It actually went a bit further than my suggestion, if I'm reading 
the summary correctly.

For example, right now we go:

Vector3 vSomeTempName = v1 + v2;
someVectorFunc( vSomeTempName );

This will keep the vSomeTempName entirely in scope and living on 
the stack for as long as that code block is active. A 
simplification step would be to store rvalues on the stack 
without needing to name them, and only destroying them once the 
block's scope goes out of scope.

It still provides an easy escape from a C++ function though. For 
example:

D code:

return someVectorFunc( v1 + v2 );

C++ code:

const Vector3& someVectorFunc( const Vector3& someVector )
{
   return someVector;
}

You'd still want to insert some sanity checking code in the code 
gen to throw an exception if the C++ function is returning a 
reference to the current stack and your D function is also 
returning by reference.


More information about the Digitalmars-d mailing list