それはそうのように、両方のconstおよび可変バリアントを宣言することは珍しいことではありません:あなたのプログラムと
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; // << error: return mutable reference from const method
}
ので、あなたはそれがこのフォームを使用してCONSTます
const std::vector<int>& VectorHolder::getVector() const {
return myVector; // << ok
}
と、これは非constのメソッドであるか、クライアントが非constの参照を保持し、その後、あなたが合法的に非を使用することができますconstの方法:
std::vector<int>& VectorHolder::getVector() {
return myVector; // << ok
}
最後に、あなたが(場合によっては)値を返すことができます:
std::vector<int> VectorHolder::getVector() const {
return myVector; // << ok
}
コピーは突然変異を必要とせず、内部データにさらされないためです。
だから、両方のバリエーションをかなり頻繁に宣言することになります。両方を宣言する
結果は、次のとおり
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
のですべてが(離れ方法の冗長性から)うまくうまくいきます。
は、あなたがそれを返すコードから後で返さベクトルを修正するために、その後は不可能である:
したがって、あなたは()は、この方法で、それぞれgetVectorを宣言する必要がありますか? – arjacsoh
@arjacsoh:それは異なります。編集を参照してください。 – Nawaz