const ref rvalues

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Dec 14 14:15:14 PST 2009


Denis Koroskin wrote:
> On Mon, 14 Dec 2009 23:38:34 +0300, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> wrote:
> 
>> Denis Koroskin wrote:
>>> On Mon, 14 Dec 2009 21:06:20 +0300, dsimcha <dsimcha at yahoo.com> wrote:
>>>
>>>> I mentioned this deep in another thread, but I think it deserves its 
>>>> own
>>>> thread.  Can we get something like:
>>>>
>>>> void doStuff(T)(const ref T val) {
>>>>     // do stuff.
>>>> }
>>>>
>>>> T getVal() {
>>>>     return someValue;
>>>> }
>>>>
>>>> void main() {
>>>>     doStuff(getVal());  // Doesn't currently work.
>>>> }
>>>>
>>>> For non-const ref parameters, it's understandable that passing 
>>>> rvalues in
>>>> doesn't work because this is likely a bug that the compiler should 
>>>> catch.
>>>> However, for const ref parameters, can't the compiler just 
>>>> implicitly put the
>>>> value on the caller's stack frame and convert it to an lvalue rather 
>>>> than
>>>> forcing the programmer to write the boilerplate to do this 
>>>> manually?  This
>>>> would result in:
>>>>
>>>> doStuff(getVal()); -->
>>>>
>>>> auto __temp = getVal();
>>>> doStuff(__temp);
>>>  I agree it hurts a lot. I faced the same problem implementing 
>>> RefCounted: you can't return RefCounted object from one function and 
>>> pass it by reference to another one. Passing it by value is not a 
>>> good option.
>>
>> The compiler will optimize that case.
>>
>> Andrei
> 
> How can it optimize away a function with a side effect (RefCounted 
> ctor/dtor invokes an interlocked increment/decrement that theoretically 
> may destroy an object, but wouldn't in practice)? Make it special for 
> compiler?

The compiler can optimize away all copies followed by the destruction of 
the source. It suffices to just move memory.

Andrei



More information about the Digitalmars-d mailing list