nó không phải là bất thường để tuyên bố cả hai biến thể const và có thể thay đổi, như vậy:
std::vector<int>& VectorHolder::getVector() {
return myVector;
}
const std::vector<int>& VectorHolder::getVector() const {
return myVector;
}
vấn đề cơ bản với chương trình của bạn là bạn trả về một tham chiếu không const từ một phương pháp const.
std::vector<int>& VectorHolder::getVector() const {
return myVector; // << error: return mutable reference from const method
}
vì vậy bạn làm cho nó const sử dụng hình thức này:
const std::vector<int>& VectorHolder::getVector() const {
return myVector; // << ok
}
và khi điều này là trong một phương pháp const không hoặc khách hàng giữ một tham chiếu không const, sau đó bạn có thể sử dụng một cách hợp pháp một phi phương pháp const:
std::vector<int>& VectorHolder::getVector() {
return myVector; // << ok
}
cuối cùng, bạn có thể trả về giá trị (trong một số trường hợp):
std::vector<int> VectorHolder::getVector() const {
return myVector; // << ok
}
vì bản sao không yêu cầu đột biến và không cung cấp phơi nhiễm cho dữ liệu nội bộ.
vì vậy bạn sẽ kết thúc tuyên bố cả hai biến thể khá thường xuyên.
kết quả của tuyên bố cả hai đều là:
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
vì thế tất cả các công trình ra độc đáo (ngoài những dư thừa của phương pháp).
Bằng cách này là sau đó không thể thay đổi véc tơ quay trở lại sau đó từ mã nơi bạn quay lại nó? – arjacsoh
@arjacsoh: Điều đó phụ thuộc. Xem chỉnh sửa. – Nawaz