On Wednesday, 24 June 2015 at 07:12:53 UTC, Iain Buclaw wrote:
On 22 Jun 2015 08:40, "Andrei Alexandrescu via Digitalmars-d" <
digitalmars-d@puremagic.com> 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.
Call expression, or statement containing the call expression? For
normal temporaries, it's the latter AFAIK.
int i = 42;
struct S { ~this() { i++; } }
// auto __autoreftmp = S();
foo(S()); // __autoreftmp
// __dtor(__autoreftmp);
assert(i == 43);
It would make a difference for:
auto x = foo(S()) + foo(S());
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 ...
Not possible because it's not implemented, or are there
fundamental reasons against it?