c++c++11return-value-optimizationobject-destruction

RVO vs std::unique_ptr<> cleanup


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;
}

Solution

  • 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;