On 22 Jun 2015 08:40, "Andrei Alexandrescu via Digitalmars-d" <
[email protected]> wrote:
>
> On 6/21/15 11:31 PM, Andrei Alexandrescu wrote:
>>
>> On 6/21/15 10:25 PM, Walter Bright wrote:
>>>
>>> The idea is that fun(5) would be lowered to:
>>>
>>> auto tmp = 5;
>>> fun(tmp);
>>
>>
>> I don't think that lowering is recommended - it prolongs the lifetime of
>> the temporary through the end of the caller. But that may be actually a
>> good thing.
>
>
> On second thought - Walter's lowering, which makes the rvalue last more
than strictly necessary, may be the most flexible of all at the cost of
more resource consumption (for types that define destructors). -- Andrei
>
I think keeping the lifetime of objects strictly in the call expression is
the behaviour that will give least surprise.
int i = 42;
struct S { ~this() { i++; } }
// auto __autoreftmp = S();
foo(S()); // __autoreftmp
// __dtor(__autoreftmp);
assert(i == 43);
As for optimisations, I think it should be possible to assert that the
reference never escapes, and use more aggressive optimisations based on
that, something that is still not possible with 'scope ref' or 'in ref'
parameters ...
Iain.