In un mondo ideale, tutti i puntatori proprietari sono puntatori intelligenti e i puntatori non proprietari grezzi vengono utilizzati solo quando NULL è considerato un valore potenzialmente valido. Se è vero che specificObject
sarà sempre essere in objects
, allora almeno in teoria dovrebbe essere possibile rendere specificObject
un riferimento a Object
, permettendo così al compilatore di imporre che ha sempre un valore non NULL per tutta la sua durata.
In un mondo tutt'altro che ideale, potrebbe non essere possibile o addirittura possibile inizializzare specificObject
per puntare a un membro di objects
, a seconda di come esattamente specificObject
è determinato e se tale logica può ragionevolmente essere constexpr
'd. Quindi la domanda si riduce a qualunque sia la durata di tutte le Object
s all'interno di objects
. Se sai che continueranno a esistere almeno finchè specificObjects
lo fa, allora un puntatore raw non proprietario è perfettamente sicuro. Sospetto che questa sia la situazione più tipica.
In un mondo molto non ideale, potrebbe essere possibile per objects
guadagnare e perdere i suoi membri in qualsiasi momento, quindi è necessario tenere conto della possibilità che specificObject
venga invalidato mentre il tuo programma è ancora cercando di fare cose con esso. In questo caso, weak_ptr
è lo strumento di scelta, in quanto è specificamente progettato per situazioni in cui non si sa quando la vita dell'oggetto potrebbe terminare, ma non si vuole prolungarla inutilmente. Ovviamente, ciò richiederebbe la modifica di tutti i unique_ptr
s in shared_ptr
s, e non sorprende che sia il meno intuitivo dei puntatori intelligenti, motivo per cui sto menzionando questa opzione per ultimo.