This code is what I want to do:
Tony& Movie::addTony()
{
Tony *newTony = new Tony;
std::unique_ptr tony(newTony);
attachActor(std::m
The standard says (§ 20.8.1.2.1 ¶ 16, emphasis added) that the move constructor of std::unique_ptr
unique_ptr(unique_ptr&& u) noexcept;
Constructs a
unique_ptr
by transferring ownership fromu
to*this
.
Therefore, after you move-construct the temporary object that gets passed as argument to attachActor
form your tony
, tony
no longer owns the object and hence tony.get() == nullptr
. (This is one of the few cases where the standard library actually makes assertions about the state of a moved-away-from object.)
However, the desire to return the reference can be fulfilled without resorting to naked new
and raw pointers.
Tony&
Movie::addTony()
{
auto tony = std::make_unique();
auto p = tony.get();
attachActor(std::move(tony));
return *p;
}
This code assumes that attachActor
will not drop its argument on the floor. Otherwise, the pointer p
would dangle after attachActor
has return
ed. If this cannot be relied upon, you'll have to re-design your interface and use shared pointers instead.
std::shared_ptr
Movie::addTony()
{
auto tony = std::make_shared();
attachActor(tony);
return tony;
}