The definition of postblit generates an non-templated built-in opAssign implicitly. And it conflicts with your templated opAssign.
It is already filed in bugzilla. Issue 4424 - Copy constructor and templated opAssign cannot coexist http://d.puremagic.com/issues/show_bug.cgi?id=4424 Kenji Hara 2012/1/12 Benjamin Thaut <[email protected]>: > Am 11.01.2012 20:05, schrieb Timon Gehr: >> >> On 01/11/2012 05:58 PM, Benjamin Thaut wrote: >> >>> 1. It's currently not possible to overload opAssign for structs with a >>> template because opAssign(T)(T rh) if(is(T == typeof(this))) >>> >>> is not allowed (stated in the documentation). And templates can not >>> overload non template functions (already a known bug). >>> >>> 2. It's not possible to use auto ref with opAssign because >>> opAssign(T)(auto ref T rh) if(is(T == typeof(this))) is not allowed >>> (partly the same issue as 1). >>> >>> Why is this not allowed? (The documentation does not state any reason) >> >> >> There is no reason, and DMD accepts it. Maybe file a bug against the >> documentation? >> >> struct S{ >> auto opAssign(T)(auto ref T rhs) if(is(T==typeof(this))){return rhs;} >> } >> >> void main(){ >> S a, b; >> a=b; >> } >> >>> >>> 3. Calling a method that is overloaded with shared / const / immutable >>> from within a function has to be done with this.method() >>> otherwise the compiler complains about ambugiosity. Is method() not the >>> same as this.method() ?? >>> >> >> Yes it is. Has this been filed already? > > > I have a repro case for issue 1+2. It seems to be connected to the bostplit > constructor. Does the postblit constructor infer with opAssign overloading? > > struct Array(T){ > T[] data; > > alias typeof(this) this_t; > > this(this) > { > data = data.dup; > } > > this_t opAssign(U)(auto ref U rh) if(is(U == this_t)) > { > data = rh.data; > return rh; > } > > auto opAssign(U)(U rh) if(is(U == T[])) > { > data = rh; > return rh; > } > } > > int main(string[] argv) > { > Array!int bla; > bla = [1,2,3]; > return 0; > } > > main.d(15): Error: function main.Array!(int).Array.opAssign conflicts with > template main.Array!(int).Array.opAssign(U) if (is(U == this_t)) at > main.d(25) > main.d(40): Error: template instance main.Array!(int) error instantiating > > > -- > Kind Regards > Benjamin Thaut
