nie jest niczym niezwykłym, aby zadeklarować oba warianty const i zmienny, jak w przykładzie:
std::vector<int>& VectorHolder::getVector() {
return myVector;
}
const std::vector<int>& VectorHolder::getVector() const {
return myVector;
}
podstawowy problem z programem jest to, że wrócisz const odniesienia z metody const.
std::vector<int>& VectorHolder::getVector() const {
return myVector; // << error: return mutable reference from const method
}
więc zrobić to za pomocą tego formularza const:
const std::vector<int>& VectorHolder::getVector() const {
return myVector; // << ok
}
i kiedy jest to w nie sposób const lub klient posiada non-const odniesienia, można legalnie używać nie- metoda const:
std::vector<int>& VectorHolder::getVector() {
return myVector; // << ok
}
wreszcie, można zwrócić wartość (w niektórych przypadkach):
std::vector<int> VectorHolder::getVector() const {
return myVector; // << ok
}
ponieważ kopia nie wymaga mutacji i nie naraża na dane wewnętrzne.
, więc często będziesz deklarować oba warianty.
wyniki deklarując obie są:
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
tak to wszystko działa dobrze (oprócz zwolnienia z metod).
W ten sposób jest więc niemożliwe, aby zmodyfikować wektor zwrócony później z kodu gdzie ją zamian? – arjacsoh
@arjacsoh: To zależy. Zobacz edycję. – Nawaz