non è insolito per dichiarare entrambe le varianti const e mutevole, in questo modo:
std::vector<int>& VectorHolder::getVector() {
return myVector;
}
const std::vector<int>& VectorHolder::getVector() const {
return myVector;
}
il problema di fondo con il vostro programma è che ritorni un riferimento non-const da un metodo const.
std::vector<int>& VectorHolder::getVector() const {
return myVector; // << error: return mutable reference from const method
}
in modo da renderlo const utilizzando questo modulo:
const std::vector<int>& VectorHolder::getVector() const {
return myVector; // << ok
}
e quando questo si trova in un metodo non const o il client contiene un riferimento non-const, allora si può legalmente utilizzare un non- metodo const:
std::vector<int>& VectorHolder::getVector() {
return myVector; // << ok
}
, infine, si potrebbe restituire un valore (in alcuni casi):
std::vector<int> VectorHolder::getVector() const {
return myVector; // << ok
}
perché la copia non richiede alcuna mutazione e non fornisce alcuna esposizione ai dati interni.
così finirete per dichiarare abbastanza spesso entrambe le varianti.
i risultati di dichiarare entrambi sono:
VectorHolder m;
const VectorHolder c;
m.getVector().size(); // << ok
c.getVector().size(); // << ok - no mutation
m.getVector().push_back(a); // << ok
c.getVector().push_back(a); // << error: attempt to mutate const reference because the const vector is returned
quindi tutto risolve piacevolmente (a parte la ridondanza dei metodi).
in questo modo è quindi possibile modificare il vettore restituita in seguito dal codice in cui si restituirlo? – arjacsoh
@arjacsoh: dipende. Vedi la modifica. – Nawaz