Lo standard dice (§ 20.8.1.2.1 ¶ 16, il corsivo è mio) che il costruttore mossa di std::unique_ptr
unique_ptr(unique_ptr&& u) noexcept;
Costruisce un unique_ptr
da trasferimento della proprietà da u
a *this
.
Pertanto, dopo aver spostato-costruire l'oggetto temporaneo che viene passato come argomento al attachActor
formare il vostro tony
, tony
non possiede più l'oggetto e quindi tony.get() == nullptr
. (Questo è uno dei pochi casi in cui la libreria standard effettivamente fa asserzioni sullo stato di un oggetto spostato da).
Tuttavia, il desiderio di restituire il riferimento può essere soddisfatto senza ricorrere a n. new
e raw puntatori.
Tony&
Movie::addTony()
{
auto tony = std::make_unique<Tony>();
auto p = tony.get();
attachActor(std::move(tony));
return *p;
}
Questo codice presuppone che attachActor
non cadrà sua tesi sul pavimento. In caso contrario, il puntatore p
ciondolerebbe dopo attachActor
ha return
ed. Se non si può fare affidamento su questo, dovrai ridefinire la tua interfaccia e utilizzare invece i puntatori condivisi.
std::shared_ptr<Tony>
Movie::addTony()
{
auto tony = std::make_shared<Tony>();
attachActor(tony);
return tony;
}
Perché stai 'move()' 'ing' the unique_ptr' in 'attachActor()' per cominciare? Cosa fa effettivamente 'attachActor()'? –