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.