On 2011-05-20 10:30:33 -0400, Sean Kelly <[email protected]> said:
On May 20, 2011, at 5:14 AM, Benjamin Thaut wrote:The following program: import std.stdio; struct test { this(this){ writefln("postblit"); } int foo; this(int i){ foo = i; writefln("%x",&foo); } ~this(){ writefln("%x",&foo); } } void main(string[] args){ test t = test(5); } Gives me this output on dmd 2.052: 18fe58 18fe54 Is this a bug in 2.052? (Doesn't happen with 2.053) Why did the location of the struct change? Is there any way to get informed about a struct beeing moved? Is there a way to prevent it?In main above you're declaring a new struct variable t which is default-constructed, then a temporary is created and initialized to 5, and then the temporary is copied onto t. It does seem like a postblit should probably occur in this scenario though.
Postblit is a post-copy constructor, not a post-move one. There is no such thing as a post-move constructor in D: structs are assumed to be movable.
If the compiler was constructing the struct in place (instead of moving it) it'd be even better, but that's more a question of optimization than semantics.
-- Michel Fortin [email protected] http://michelf.com/
