Am 20.05.2011 19:28, schrieb Michel Fortin:
On 2011-05-20 10:30:33 -0400, Sean Kelly <s...@invisibleduck.org> 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.


What if I need a value type that may be copied, but may not be moved?

--
Kind Regards
Benjamin Thaut

Reply via email to