#include <iostream>
using namespace std;
struct HasAResource
{
int* arr;
HasAResource(int size):
arr(new int [size])
{
cout << "size constructor: " << this << endl;
}
HasAResource(const HasAResource& other) = delete;
HasAResource& operator=(const HasAResource& other) = delete;
HasAResource(HasAResource&& other):
arr(nullptr)
{
arr = other.arr;
other.arr = nullptr;
cout << "move constructor: " << this << endl;
}
HasAResource& operator=(HasAResource&& other)
{
cout << "move assignment: from " << &other << " to " << this << endl;
if (this != &other)
{
delete[] arr;
arr = other.arr;
other.arr = nullptr;
}
return *this;
}
~HasAResource()
{
cout << "destructor: " << this << endl;
delete[] arr;
}
void doStuff()
{
cout << "doStuff: " << this << endl;
// do stuff...
}
static HasAResource doStuff(int size)
{
cout << "doStuff(int)" << endl;
HasAResource x(size);
x.doStuff();
return x;
}
};
int main()
{
HasAResource x = HasAResource::doStuff(42);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEhhc0FSZXNvdXJjZQp7CiAgICBpbnQqIGFycjsKCiAgICBIYXNBUmVzb3VyY2UoaW50IHNpemUpOgogICAgICAgIGFycihuZXcgaW50IFtzaXplXSkKICAgIHsKICAgIAljb3V0IDw8ICJzaXplIGNvbnN0cnVjdG9yOiAiIDw8IHRoaXMgPDwgZW5kbDsKICAgIH0KCiAgICBIYXNBUmVzb3VyY2UoY29uc3QgSGFzQVJlc291cmNlJiBvdGhlcikgPSBkZWxldGU7CiAgICBIYXNBUmVzb3VyY2UmIG9wZXJhdG9yPShjb25zdCBIYXNBUmVzb3VyY2UmIG90aGVyKSA9IGRlbGV0ZTsKCiAgICBIYXNBUmVzb3VyY2UoSGFzQVJlc291cmNlJiYgb3RoZXIpOgogICAgICAgIGFycihudWxscHRyKQogICAgewogICAgICAgIGFyciA9IG90aGVyLmFycjsKICAgICAgICBvdGhlci5hcnIgPSBudWxscHRyOwogICAgCWNvdXQgPDwgIm1vdmUgY29uc3RydWN0b3I6ICIgPDwgdGhpcyA8PCBlbmRsOwogICAgfQoKICAgIEhhc0FSZXNvdXJjZSYgb3BlcmF0b3I9KEhhc0FSZXNvdXJjZSYmIG90aGVyKQogICAgewogICAgCWNvdXQgPDwgIm1vdmUgYXNzaWdubWVudDogZnJvbSAiIDw8ICZvdGhlciA8PCAiIHRvICIgPDwgdGhpcyA8PCBlbmRsOwogICAgICAgIGlmICh0aGlzICE9ICZvdGhlcikKICAgICAgICB7CiAgICAgICAgICAgIGRlbGV0ZVtdIGFycjsKICAgICAgICAgICAgYXJyID0gb3RoZXIuYXJyOwogICAgICAgICAgICBvdGhlci5hcnIgPSBudWxscHRyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgfkhhc0FSZXNvdXJjZSgpCiAgICB7CiAgICAJY291dCA8PCAiZGVzdHJ1Y3RvcjogIiA8PCB0aGlzIDw8IGVuZGw7CiAgICAJZGVsZXRlW10gYXJyOwogICAgfQoKCXZvaWQgZG9TdHVmZigpCgl7CiAgICAJY291dCA8PCAiZG9TdHVmZjogIiA8PCB0aGlzIDw8IGVuZGw7CgkJLy8gZG8gc3R1ZmYuLi4KCX0KCglzdGF0aWMgSGFzQVJlc291cmNlIGRvU3R1ZmYoaW50IHNpemUpCiAgICB7CiAgICAJY291dCA8PCAiZG9TdHVmZihpbnQpIiA8PCBlbmRsOwoJCUhhc0FSZXNvdXJjZSB4KHNpemUpOwoJCXguZG9TdHVmZigpOwoJCXJldHVybiB4OwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBIYXNBUmVzb3VyY2UgeCA9IEhhc0FSZXNvdXJjZTo6ZG9TdHVmZig0Mik7CiAgICByZXR1cm4gMDsKfQ==