#include<iostream>
struct Test {
Test( ) { std:: cout << "Constructed.\n " ; }
~Test( ) { std:: cout << "Destructed.\n " ; }
Test( Test const & ) { std:: cout << "Copy-Constructed.\n " ; }
Test( Test && ) { std:: cout << "Move-Constructed.\n " ; }
Test & operator= ( Test const & ) { std:: cout << "Copy-Assigned.\n " ; return * this ; }
Test & operator= ( Test && ) { std:: cout << "Move-Assigned.\n " ; return * this ; }
} ;
int main( ) {
std:: cout << "Test t;\n " ;
Test t; //Construction
std:: cout << "Test t2(t);\n " ;
Test t2( t) ; //Copy-Construct
std:: cout << "Test t3(std::move(t2));\n " ;
Test t3( std:: move ( t2) ) ; //Move-Construct
std:: cout << "Test t4 = t;\n " ;
Test t4 = t; //Copy Construct, due to Copy Ellision
std:: cout << "Test t5 = Test();\n " ;
Test t5 = Test( ) ; //Will probably be a normal Construct, due to Copy Ellision
std:: cout << "t = t2;\n " ;
t = t2; //Copy Assign
std:: cout << "t = Test();\n " ;
t = Test( ) ; //Move Assign, will invoke Constructor and Destructor on temporary
std:: cout << "Done! Cleanup will now happen!\n " ;
return 0 ;
}
I2luY2x1ZGU8aW9zdHJlYW0+CgpzdHJ1Y3QgVGVzdCB7CiAgICBUZXN0KCkge3N0ZDo6Y291dCA8PCAiQ29uc3RydWN0ZWQuXG4iO30KICAgIH5UZXN0KCkge3N0ZDo6Y291dCA8PCAiRGVzdHJ1Y3RlZC5cbiI7fQogICAgVGVzdChUZXN0IGNvbnN0Jikge3N0ZDo6Y291dCA8PCAiQ29weS1Db25zdHJ1Y3RlZC5cbiI7fQogICAgVGVzdChUZXN0ICYmKSB7c3RkOjpjb3V0IDw8ICJNb3ZlLUNvbnN0cnVjdGVkLlxuIjt9CiAgICBUZXN0ICYgb3BlcmF0b3I9KFRlc3QgY29uc3QmKSB7c3RkOjpjb3V0IDw8ICJDb3B5LUFzc2lnbmVkLlxuIjsgcmV0dXJuICp0aGlzO30KICAgIFRlc3QgJiBvcGVyYXRvcj0oVGVzdCAmJikge3N0ZDo6Y291dCA8PCAiTW92ZS1Bc3NpZ25lZC5cbiI7IHJldHVybiAqdGhpczt9Cn07CgppbnQgbWFpbigpIHsKCXN0ZDo6Y291dCA8PCAiVGVzdCB0O1xuIjsKICAgIFRlc3QgdDsgLy9Db25zdHJ1Y3Rpb24KCXN0ZDo6Y291dCA8PCAiVGVzdCB0Mih0KTtcbiI7CiAgICBUZXN0IHQyKHQpOyAvL0NvcHktQ29uc3RydWN0CglzdGQ6OmNvdXQgPDwgIlRlc3QgdDMoc3RkOjptb3ZlKHQyKSk7XG4iOwogICAgVGVzdCB0MyhzdGQ6Om1vdmUodDIpKTsgLy9Nb3ZlLUNvbnN0cnVjdAoJc3RkOjpjb3V0IDw8ICJUZXN0IHQ0ID0gdDtcbiI7CiAgICBUZXN0IHQ0ID0gdDsgLy9Db3B5IENvbnN0cnVjdCwgZHVlIHRvIENvcHkgRWxsaXNpb24KCXN0ZDo6Y291dCA8PCAiVGVzdCB0NSA9IFRlc3QoKTtcbiI7CiAgICBUZXN0IHQ1ID0gVGVzdCgpOyAvL1dpbGwgcHJvYmFibHkgYmUgYSBub3JtYWwgQ29uc3RydWN0LCBkdWUgdG8gQ29weSBFbGxpc2lvbgoJc3RkOjpjb3V0IDw8ICJ0ID0gdDI7XG4iOwogICAgdCA9IHQyOyAvL0NvcHkgQXNzaWduCglzdGQ6OmNvdXQgPDwgInQgPSBUZXN0KCk7XG4iOwogICAgdCA9IFRlc3QoKTsgLy9Nb3ZlIEFzc2lnbiwgd2lsbCBpbnZva2UgQ29uc3RydWN0b3IgYW5kIERlc3RydWN0b3Igb24gdGVtcG9yYXJ5CiAgICBzdGQ6OmNvdXQgPDwgIkRvbmUhIENsZWFudXAgd2lsbCBub3cgaGFwcGVuIVxuIjsKICAgIHJldHVybiAwOwp9