Il n'est pas rare de déclarer des variantes constantes et mutables, comme ceci :
std::vector<int>& VectorHolder::getVector() {
return myVector;
}
const std::vector<int>& VectorHolder::getVector() const {
return myVector;
}
le problème sous-jacent de votre programme est que vous retournez une référence non-const depuis une méthode const.
std::vector<int>& VectorHolder::getVector() const {
return myVector; // << error: return mutable reference from const method
}
donc vous le rendez constant en utilisant ce formulaire :
const std::vector<int>& VectorHolder::getVector() const {
return myVector; // << ok
}
et lorsque cela se trouve dans une méthode non constante ou que le client détient une référence non constante, alors vous pouvez légalement utiliser une méthode non constante :
std::vector<int>& VectorHolder::getVector() {
return myVector; // << ok
}
enfin, vous pouvez renvoyer une valeur (dans certains cas) :
std::vector<int> VectorHolder::getVector() const {
return myVector; // << ok
}
parce que la copie ne nécessite aucune mutation et ne fournit aucune exposition aux données internes.
vous finirez donc par déclarer les deux variantes assez souvent.
les résultats de la déclaration des deux sont :
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
donc tout fonctionne bien (à part la redondance des méthodes).