This is a question about C++ specs on object destruction vs Return-Value-Optimization.
Can I expect RVO return the right value before std::unique_ptr<>
cleanup?
Foo Bar()
{
std::unique_ptr<Foo> ptr = new Foo();
return *ptr;
}
It will return the right value with or without RVO (and there is no RVO in this case). The function returns a concrete Foo
, so *ptr
will be copied into the return value before destruction of the pointer.
That means,
Foo foo;
foo = Bar();
is similar to (unwrapping the unique_ptr to be more explicit)
Foo foo;
Foo* ptr = new Foo;
foo = *ptr;
finally:
delete ptr;