On Thursday, August 18, 2011 12:49 kennytm wrote: > Trass3r <u...@known.com> wrote: > > struct A {} > > static A bar() > > { > > > > return A(); > > > > } > > void foo(ref A a) {} > > void main() > > { > > > > foo(A()); // works > > foo(bar()); // doesn't > > > > } > > > > Where's the difference? > > The difference -- you've answered yourself in the title ;). > > Reason why struct literals are lvalues -- because Walter and others believe > this is valid. Check the discussion in bugzilla issues 5178 and 5889.
Yeah. I don't understand why a struct literal would be an lvalue. It's a temporary. What possible value does it have? It's not a variable. It doesn't refer to a variable. Why would you be able to assign to anything which is not a variable (or indirectly refers to one - e.g. with ref)? The result is incredibly confusing - especially when you mix const ref into the mix. I grant you that changing it now would break code - especially given http://d.puremagic.com/issues/show_bug.cgi?id=3659 - but it serves no real purpose except to confuse as far as I can see. - Jonathan M Davis