通常情况下会同时声明const和mutable变量,像这样:
it's not unusual to declare both const and mutable variants, like so:
std::vector<int>& VectorHolder::getVector() {
return myVector;
}
const std::vector<int>& VectorHolder::getVector() const {
return myVector;
}
你程序中的根本问题是在 const 方法中返回了一个非 const 引用。
std::vector<int>& VectorHolder::getVector() const {
return myVector;
}
所以,您可以使用以下形式将其声明为const:
const std::vector<int>& VectorHolder::getVector() const {
return myVector;
}
如果这个方法不是 const 的,或者客户端持有一个非 const 引用时,你可以合法地使用一个非 const 方法:
std::vector<int>& VectorHolder::getVector() {
return myVector;
}
最后,在某些情况下,你可以返回一个值:
std::vector<int> VectorHolder::getVector() const {
return myVector;
}
因为复制不需要改变数据,并且不会暴露内部数据。
所以你最终会经常声明这两个变量。
声明这两个变量的结果是:
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
所以一切都很顺利(除了方法的冗余)。