
Marshall Clow wrote:
On Aug 20, 2011, at 10:45 AM, Olaf van der Spek wrote:
On Sat, Aug 20, 2011 at 6:28 PM, Mathias Gaunard <mathias.gaunard@ens-lyon.org> wrote:
You cannot use bitwise copy to implement move semantics. That just doesn't work.
Hmm, why not? What breaks if you do a bitwise swap?
Consider a type that looks contains a pointer to one of its member vars.
struct Foo { char *curPos; char buffer [ 8 ]; Foo () : curPos (buffer+4) {} };
Foo a, b;
Let's assume that a is at 0x1000, and b is at 0x2000 (and four byte pointers)
0x1000: 00001008 0x1004: aaaaaaaaa 0x1008: bbbbbbbb
0x2000: 00002008 0x2004: cccccccccc 0x2008: dddddddd
Now we do a (bitwise) swap of a and b:
0x1000: 00002008 0x1004: cccccccccc 0x1008: dddddddd
0x2000: 00001008 0x2004: aaaaaaaaa 0x2008: bbbbbbbb
a's pointer now points into b's buffer.
I see. I'll have to relax my claim that the swap algorithm will work for *any* type. Authors of such a class would have to be warned that they can't use the swap algorithm which applies move_raw. I can think of one other case in which it doesn't work: when the object contains a pointer to something that points back to the object. Though I don't know why someone would want to do that.