#include <iostream>
using namespace std;
class Foo
{
public :
int a,b,c;
double d,e,f;
string text;
Foo ( )
{
cout << "Sup" << endl;
}
~Foo( )
{
cout << "R.I.P." << endl;
}
static Foo getInstance( )
{
Foo o;
o.a = 42 ;
o.text = "42" ;
return o;
}
static Foo getInstanceWithoutNRVO( )
{
if ( false )
return Foo( ) ;
Foo o;
o.a = 43 ;
o.text = "43" ;
return o;
}
} ;
int main( ) {
cout << "Creating \" a\" " << endl;
Foo a;
cout << "Assigning a new value to \" a\" " << endl;
a = Foo:: getInstance ( ) ;
cout << a.a << " " << a.text << endl;
cout << "Assigning a new value to \" a\" without NRVO" << endl;
a = Foo:: getInstanceWithoutNRVO ( ) ;
cout << a.a << " " << a.text << endl;
cout << "Cleaning up and finishing work" << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjbGFzcyBGb28KewpwdWJsaWM6CglpbnQgYSxiLGM7CiAgICBkb3VibGUgZCxlLGY7CiAgICBzdHJpbmcgdGV4dDsKICAgIEZvbyAoKQogICAgewogICAgCWNvdXQgPDwgIlN1cCIgPDwgZW5kbDsKICAgIH0KICAgIH5Gb28oKQogICAgewogICAgCWNvdXQgPDwgIlIuSS5QLiIgPDwgZW5kbDsKICAgIH0KCQoJc3RhdGljIEZvbyBnZXRJbnN0YW5jZSgpCgl7CgkJRm9vIG87CgkJby5hID0gNDI7CgkJby50ZXh0ID0gIjQyIjsKCQlyZXR1cm4gbzsKCX0KCXN0YXRpYyBGb28gZ2V0SW5zdGFuY2VXaXRob3V0TlJWTygpCgl7CgkJaWYgKGZhbHNlKQoJCQlyZXR1cm4gRm9vKCk7CgkJCQoJCUZvbyBvOwoJCW8uYSA9IDQzOwoJCW8udGV4dCA9ICI0MyI7CgkJcmV0dXJuIG87Cgl9Cn07CgppbnQgbWFpbigpIHsKCWNvdXQgPDwgIkNyZWF0aW5nIFwiYVwiIiA8PCBlbmRsOwoJRm9vIGE7CgkKCWNvdXQgPDwgIkFzc2lnbmluZyBhIG5ldyB2YWx1ZSB0byBcImFcIiIgPDwgZW5kbDsKCWEgPSBGb286OmdldEluc3RhbmNlKCk7Cgljb3V0IDw8IGEuYSA8PCAiICIgPDwgYS50ZXh0IDw8IGVuZGw7CgkKCWNvdXQgPDwgIkFzc2lnbmluZyBhIG5ldyB2YWx1ZSB0byBcImFcIiB3aXRob3V0IE5SVk8iIDw8IGVuZGw7CglhID0gRm9vOjpnZXRJbnN0YW5jZVdpdGhvdXROUlZPKCk7Cgljb3V0IDw8IGEuYSA8PCAiICIgPDwgYS50ZXh0IDw8IGVuZGw7CgkKCWNvdXQgPDwgIkNsZWFuaW5nIHVwIGFuZCBmaW5pc2hpbmcgd29yayIgPDwgZW5kbDsKCXJldHVybiAwOwp9