#include <iostream>
struct example
{
example()
{
std::cout << "construct\n";
}
~example()
{
std::cout << "destroy\n";
}
example(const example & )
{
std::cout << "copy\n";
}
example(example && )
{
std::cout << "move\n";
}
example& operator=(const example & )
{
std::cout << "assign\n";
return *this;
}
example& operator=(example && )
{
std::cout << "move assign\n";
return *this;
}
};
example ReturnSomething1()
{
std::cout << "in 1\n";
example test;
std::cout << "created example\n";
return test;
}
example ReturnSomething2()
{
std::cout << "in 2\n";
return example();
}
int main()
{
std::cout << "1\n";
example x = ReturnSomething1();
std::cout << "2\n";
example y = ReturnSomething2();
std::cout << "exiting\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdHJ1Y3QgZXhhbXBsZQp7CiAgICBleGFtcGxlKCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImNvbnN0cnVjdFxuIjsKICAgIH0KICAgIH5leGFtcGxlKCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImRlc3Ryb3lcbiI7CiAgICB9CiAgICBleGFtcGxlKGNvbnN0IGV4YW1wbGUgJiApCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJjb3B5XG4iOwogICAgfQogICAgZXhhbXBsZShleGFtcGxlICYmICkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIm1vdmVcbiI7CiAgICB9CiAgICBleGFtcGxlJiBvcGVyYXRvcj0oY29uc3QgZXhhbXBsZSAmICkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImFzc2lnblxuIjsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBleGFtcGxlJiBvcGVyYXRvcj0oZXhhbXBsZSAmJiApCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJtb3ZlIGFzc2lnblxuIjsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9Cn07CgoKZXhhbXBsZSBSZXR1cm5Tb21ldGhpbmcxKCkKewogICAgc3RkOjpjb3V0IDw8ICJpbiAxXG4iOwogICAgZXhhbXBsZSB0ZXN0OwogICAgc3RkOjpjb3V0IDw8ICJjcmVhdGVkIGV4YW1wbGVcbiI7CiAgICByZXR1cm4gdGVzdDsKfQpleGFtcGxlIFJldHVyblNvbWV0aGluZzIoKQp7CiAgICBzdGQ6OmNvdXQgPDwgImluIDJcbiI7CiAgICByZXR1cm4gZXhhbXBsZSgpOwp9CmludCBtYWluKCkKewogICAgc3RkOjpjb3V0IDw8ICIxXG4iOwogICAgZXhhbXBsZSB4ID0gUmV0dXJuU29tZXRoaW5nMSgpOwogICAgc3RkOjpjb3V0IDw8ICIyXG4iOwogICAgZXhhbXBsZSB5ID0gUmV0dXJuU29tZXRoaW5nMigpOwogICAgc3RkOjpjb3V0IDw8ICJleGl0aW5nXG4iOwoKfQ==