#include <iostream>
#include <cstring>
struct String {
char *buf;
size_t size;
String () : buf(0), size(0){}
~String () {
std::cout << "release " << (void*)buf << std::endl;
delete [] buf;
}
String (char *s) {
size = strlen(s)+1;
buf = new char[size];
strcpy (buf, s);
std::cout << "allocated at " << (void*)buf << std::endl;
}
String (String&& o) : buf(o.buf), size(o.size) { o.buf = 0; o.size = 0; }
String (const String& o) : buf(new char[o.size]), size(o.size) {
strcpy (buf, o.buf);
std::cout << "allocated at " << (void*)buf << std::endl;
}
};
void foo (String&& s) {
std::cout << s.buf << std::endl;
}
int main() {
foo (String ("test"));
String a("test1");
String b(std::move(a));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnN0cnVjdCBTdHJpbmcgewoJY2hhciAqYnVmOwoJc2l6ZV90IHNpemU7CgoJU3RyaW5nICgpIDogYnVmKDApLCBzaXplKDApe30KCX5TdHJpbmcgKCkgewoJCXN0ZDo6Y291dCA8PCAicmVsZWFzZSAiIDw8ICh2b2lkKilidWYgPDwgc3RkOjplbmRsOwoJCWRlbGV0ZSBbXSBidWY7IAoJfQoJU3RyaW5nIChjaGFyICpzKSB7CgkJc2l6ZSA9IHN0cmxlbihzKSsxOwoJCWJ1ZiA9IG5ldyBjaGFyW3NpemVdOwoJCXN0cmNweSAoYnVmLCBzKTsKCQlzdGQ6OmNvdXQgPDwgImFsbG9jYXRlZCBhdCAiIDw8ICh2b2lkKilidWYgPDwgc3RkOjplbmRsOwoJfQoJU3RyaW5nIChTdHJpbmcmJiBvKSA6IGJ1ZihvLmJ1ZiksIHNpemUoby5zaXplKSB7IG8uYnVmID0gMDsgby5zaXplID0gMDsgfQoJU3RyaW5nIChjb25zdCBTdHJpbmcmIG8pIDogYnVmKG5ldyBjaGFyW28uc2l6ZV0pLCBzaXplKG8uc2l6ZSkgewoJCXN0cmNweSAoYnVmLCBvLmJ1Zik7CgkJc3RkOjpjb3V0IDw8ICJhbGxvY2F0ZWQgYXQgIiA8PCAodm9pZCopYnVmIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKCnZvaWQgZm9vIChTdHJpbmcmJiBzKSB7CglzdGQ6OmNvdXQgPDwgcy5idWYgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpIHsKCWZvbyAoU3RyaW5nICgidGVzdCIpKTsKCQoJU3RyaW5nIGEoInRlc3QxIik7CglTdHJpbmcgYihzdGQ6Om1vdmUoYSkpOwoKCXJldHVybiAwOwp9