La domanda è di proprietà
Non fai menzione di chi possiede gli oggetti che entrano nel contenitore. Poiché shared_ptr
è un'opzione, probabilmente esiste una forma di proprietà condivisa e allocazione dello storage dinamico. Una chiara definizione di chi possiede gli oggetti e di come vengono osservati (cioè chi può osservarli) inquadrerà gran parte dell'implementazione .
In my specific case, the class containing the container actually wouldn't care if a reference somehow became invalid.
Il contenitore sta giocando un ruolo di osservatore.
However there might be a more generalised answer and a 'rule of thumb', when one should use one approach over the other.
Data la semantica del reference_wrapper
c'è una ragionevole aspettativa che l'oggetto a cui ci si riferisce sia valido mentre reference_wrapper
è valido. Nel tuo caso questo potrebbe non essere applicabile, ma in generale questo è vero e qualsiasi manutenzione fatta sul codice in una data successiva potrebbe benissimo assumere questo.
Regola generale
Permetti che la durata degli oggetti di proprietà condivisa sia gestita con std::shared_ptr
e utilizzi "observer" std::weak_ptr
nel contenitore.
Se la durata degli oggetti non è condivisa e in qualche modo legata alla durata del contenitore stesso (tramite la durata di archiviazione automatica), allora reference_wrapper
è vitale (in modo simile potrebbe anche essere un puntatore raw).