Timon Gehr <timon.g...@gmx.ch> wrote: > On 08/19/2011 03:46 PM, kennytm wrote: >> Timon Gehr<timon.g...@gmx.ch> wrote: >> >>> auto ref currently treats struct literals as lvalues too. (therefore, as >>> ref). And passing by value would be considerably less efficient for large >>> structs. >>> >>> As I understand it, the only issue with allowing literals and function >>> results as lvalues is that generic code cannot detect if it is working >>> with a temporary or not. I don't know if this would be useful in D though. >>> >>> each code segment of the form: >>> >>> void foo(ref S); >>> ... >>> foo(S(...)); >>> >>> is equivalent to one explicitly declaring the temporary: >>> >>> {auto __temp=S(...); foo(__temp);} >>> >>> The difference is that the first is more pleasant to write. If >>> temporaries would become rvalues everyone would always have to write the >>> second form manually. So imho it is just a syntax sugar issue. >>> >>> I'd actually argue that ref-passing should work for arbitrary function >>> results too. >> >> Here I propose that we go a step further and abolish the notion of rvalue >> and lvalue entirely, and let the compiler insert necessary temporary >> variable when needed, so that we can finally write things like >> >> uint w; >> memcpy(w,&5.0f, w.sizeof); >> 13u = w; >> >> </joking> > > And then of course you could do: > > 5=6; > assert(5==6); > > It hasn't been working since the good ol' days of fortran =(.
Actually that assignment would just become an expensive no-op because it will be rewritten into (int __lvalue1243 = 5, __lvalue1243) = 6; So the assert would still assert.