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.