Norma mówi (§ 20.8.1.2.1 ¶ 16, kursywa dodana), że konstruktor akcja std::unique_ptr
unique_ptr(unique_ptr&& u) noexcept;
konstruuje unique_ptr
przez przenoszącego własność z u
do *this
.
Dlatego po przeniesieniu-wybudować tymczasowy obiekt, który zostanie przekazany jako argument do attachActor
formularzu tony
, tony
już nie jest właścicielem obiektu, a tym samym tony.get() == nullptr
. (Jest to jeden z nielicznych przypadków, w których standardowa biblioteka rzeczywiście tworzy twierdzenia o stanie obiektu przeniesionego z zewnątrz).
Jednak chęć zwrócenia referencji może być spełniona bez uciekania się do nagiego new
i surowego wskaźniki.
Tony&
Movie::addTony()
{
auto tony = std::make_unique<Tony>();
auto p = tony.get();
attachActor(std::move(tony));
return *p;
}
Kod ten zakłada, że attachActor
nie zrzuci swojego argumentu na podłogę. W przeciwnym razie wskaźnik p
będzie zwisał po attachActor
ma numer return
. Jeśli nie można na nim polegać, musisz przeprojektować interfejs i zamiast tego używać wskaźników udostępnionych.
std::shared_ptr<Tony>
Movie::addTony()
{
auto tony = std::make_shared<Tony>();
attachActor(tony);
return tony;
}
Dlaczego jesteś 'move()' '' unique_ptr' na 'attachActor()' na początek? Co właściwie robi funkcja 'attachActor()'? –