On Monday, 19 November 2012 at 12:10:32 UTC, Dan wrote:
[...]
provide it - you do not need an opAssign at all, as your
postblit will be called. I think this is a step up over C++.
The example below prints:
----------------------------------------------
Begin assign
postblit A
End assign
----------------------------------------------
import std.stdio;
import std.traits;
struct A {
this(this) { c = c.dup; writeln("postblit A"); }
char[] c;
}
struct B { A a; }
struct C { B b; }
struct D { C c; }
void main() {
D d1, d2;
d1.c.b.a.c = ['a','b','c'];
writeln("Begin assign");
d2 = d1;
writeln("End assign");
}
That's VERY interesting indeed and originally I had no idea it
would do this without a custom opAssign at each level.
This kind of behavior *really* needs to be documented in precise
detail, it's rather critical to know.
--rt