Hi, > Works for me. Which version of the compiler are you using?
Sorry, i forgot to mention: i'm using dmd 2.057 on ubuntu 32bit. On Tue, Jan 31, 2012 at 5:31 PM, Timon Gehr <timon.g...@gmx.ch> wrote: > On 01/31/2012 03:03 PM, Nicolas Silva wrote: >> >> Hi, >> >> I'm playing with variants and I noticed that opAssign is not invoked >> when an assignation is done on a reference. >> >> here is the test case: >> >> import std.variant; >> >> struct Foo >> { >> Variant a; >> Variant b; >> ref Variant refA() >> { >> return a; >> } >> } >> >> void main() >> { >> Foo f1; >> f1.a = 42; // ok >> f1.b = 23; // ok >> >> f1.refA() = 24; // Error: cannot implicitly convert expression >> (24) of type int to VariantN!(maxSize) > > > Works for me. Which version of the compiler are you using? > > > >> f1.refA().opAssign( 24 ); // ok, but not very nice... >> >> // slightly OT but >> Foo f2 = { a: 10 }; // Error: cannot implicitly convert expression >> (10) of type int to VariantN!(maxSize) > > > This is http://d.puremagic.com/issues/show_bug.cgi?id=7019 > > >> } >> >> >> Is it normal? Am I missing something? >> I took Variant as an example because it does use opAssign but one >> could create a struct defining opAssign with the same results. >> >> More generally, I feel like I don't really understand the semantic of >> opAssign (or maybe references). I'd intuitively expect it to be >> invoked when the "=" operator is used on a reference and I'd also >> expect it to be invoked in struct initializers (though there might be >> something about compiletime / runtime stories in this particular >> case, yet i think one would expect it to just work). >> >> D aims at being simple and intuitive, and in this case it looks not so >> intuitive to me. > > > If something is not as simple and intuitive as it ought to be, there might > be a compiler bug. > >> >> Best regards, >> >> Nicolas Silva > >