#include <iostream>
using namespace std;
struct CtorDefParam {
CtorDefParam( ) {
cout << __FUNCTION__ << " - def.ctor! " << std:: hex << static_cast < void * > ( this ) << endl;
}
CtorDefParam( CtorDefParam const &
, int dummy= 0
) {
cout << __FUNCTION__ << " - cpy.ctor! " << std:: hex << static_cast < void * > ( this ) << endl;
}
} ;
CtorDefParam NRVO( ) {
CtorDefParam obj;
return obj;
}
CtorDefParam RVO( ) {
return CtorDefParam( ) ;
}
int main( )
{
cout << "# Init Object (should elide):\n " ;
auto obj1 = CtorDefParam( ) ; // copied once!
cout << "# Init obj from function return value (should elide via NRVO):\n " ;
auto obj2 = NRVO( ) ; // copied twice!!!
cout << "# Init obj from function return value (should elide via RVO):\n " ;
auto obj3 = RVO( ) ; // copied twice!!!
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEN0b3JEZWZQYXJhbSB7CglDdG9yRGVmUGFyYW0oKSB7CgkJY291dCA8PCBfX0ZVTkNUSU9OX18gPDwgIiAtIGRlZi5jdG9yISAiIDw8IHN0ZDo6aGV4IDw8IHN0YXRpY19jYXN0PHZvaWQqPih0aGlzKSA8PCBlbmRsOwoJfQoJCglDdG9yRGVmUGFyYW0oQ3RvckRlZlBhcmFtIGNvbnN0JgoJCSwgaW50IGR1bW15PTAKCSkgewoJCWNvdXQgPDwgX19GVU5DVElPTl9fIDw8ICIgLSBjcHkuY3RvciEgIiA8PCBzdGQ6OmhleCA8PCBzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykgPDwgZW5kbDsKCX0KfTsKCkN0b3JEZWZQYXJhbSBOUlZPKCkgewoJQ3RvckRlZlBhcmFtIG9iajsKCXJldHVybiBvYmo7Cn0KCkN0b3JEZWZQYXJhbSBSVk8oKSB7CglyZXR1cm4gQ3RvckRlZlBhcmFtKCk7Cn0KCmludCBtYWluKCkKewoJY291dCA8PCAiIyBJbml0IE9iamVjdCAoc2hvdWxkIGVsaWRlKTpcbiI7CglhdXRvIG9iajEgPSBDdG9yRGVmUGFyYW0oKTsgLy8gY29waWVkIG9uY2UhCgljb3V0IDw8ICIjIEluaXQgb2JqIGZyb20gZnVuY3Rpb24gcmV0dXJuIHZhbHVlIChzaG91bGQgZWxpZGUgdmlhIE5SVk8pOlxuIjsKCWF1dG8gb2JqMiA9IE5SVk8oKTsgLy8gY29waWVkIHR3aWNlISEhCgljb3V0IDw8ICIjIEluaXQgb2JqIGZyb20gZnVuY3Rpb24gcmV0dXJuIHZhbHVlIChzaG91bGQgZWxpZGUgdmlhIFJWTyk6XG4iOwoJYXV0byBvYmozID0gUlZPKCk7IC8vIGNvcGllZCB0d2ljZSEhIQoJcmV0dXJuIDA7Cn0KCg==