Copy elision is a neat optimization technique and in some cases relying on copy elision can actually be faster than passing around references \"by hand\".
So, let\'s
No.
But you can write an equivalent, although completely unreadable, code:
BigObj f()
{
BigObj x(g());
x.someMethod();
return x;
}
//...
BigObj z = f();
//...
is translated (with copy elision) to:
void f(BigObj* obj)
{
new(obj) BigObj(g());
obj->someMethod();
}
//...
char z[sizeof(BigObj)];
f((BigObj*)&z[0]);
//...
((BigObj*)&z[0])->~BigObj();
But seriously, just write your code in such a way that the compiler can elide the copy. I.e. return only one object without branching:
BigObj f()
{
BigObj x, y;
// use x and y
if(condition)
return x;
else
return y;
// cannot be elided
}
BigObj f()
{
if(condition)
{
BigObj x;
return x;
}
else
{
BigObj y;
return y;
}
// can be elided
}