consideri l'oggetto:Const correttezza con oggetti contenenti shared_ptr
class Obj
{
public:
Obj() : val(new int(1)) {}
int& get() {return *val;}
const int& get() const {return *val;}
private:
std::shared_ptr<int> val;
};
Come previsto, quando l'oggetto è costruito e copie sono fatti tutti possono modificare lo stesso valore attraverso la shared_ptr esposto da Ob.
Obj nonconst1;
Obj nonconst2(nonconst1);
nonconst2.get() = 2;
cout << nonconst1.get() << ", " << nonconst2.get() << endl;
E 'anche possibile copiare-costruire un oggetto const Obj
da uno dei non const, che sembra fare la cosa giusta in quanto permette di leggere ma non scrivere per il valore - come previsto i seguenti risultati di codice in un errore di compilazione:
const Obj const1(nonconst1);
const1.get() = 3;
Tuttavia è possibile copiare-costruire un non-const Obj dal const uno, che poi non permettono il valore da modificare.
Obj nonconst3(const1);
nonconst3.get() = 3;
Per me questo non mi sembra corretto.
C'è un modo per impedire questo comportamento, pur consentendo al costruttore di copiare di funzionare? Nel mio vero caso d'uso, voglio ancora che i contenitori std di Obj siano possibili.
Forse, dovresti definire il copy-constructor che prende il riferimento non const per evitare di fare copia di oggetti 'const'? – Nawaz
@Nawaz, che funziona (non mi ero reso conto che era possibile usare un ref non-const in un costruttore di copie). Sfortunatamente mi piacerebbe anche che const Obj fosse in grado di copiare altri costrutti Const obj ma il tentativo di 'Obj (const Obj & o) const' non viene compilato – tangobravo