preso da una diapositiva a cppcon2015:Impedire dereferenziazione non sicuro di std :: unique_ptr
unique_ptr<A> f() {
auto a = make_unique<A>();
return a;
}
//Why does this even compile?
const A & dangling = *f();
//BOOM!!!
use(dangling);
La mia domanda è: con i riferimenti rvalue per * questo, può risolvere il problema?
vedo nelle specifiche in cppreference:
typename std::add_lvalue_reference<T>::type operator*() const;
Domanda:
- Avrebbe senso per non consentire
operator*
per rvalueunique_ptr
s e hanno solo dereferenziare valido per lvalueunique_ptr
s? - Ci sono ancora casi d'uso validi per mantenere il valore
unique_ptr
cancellabile?
Ti piace questa:
//Make sure it is an lvalue.
typename std::add_lvalue_reference<T>::type operator*() const &;
NOTA: Non sono sicuro della sintassi o correttezza, non ho alcuna esperienza con i riferimenti rvalue per questo *.
Forse vuoi dire '* f();' invece di 'f();'? –
btw. 'const &' consentirebbe comunque all'oggetto implicito di essere un valore rvalore –
E a proposito di 'auto non_dangling = f()' per evitare il problema? È davvero il puntatore che deve essere risolto? –