STL コンテナーが const および非 const バージョンのアクセサーを定義するのはなぜですか?
非 const バージョンだけでなく、const T& at(unsigned int i) const
定義する利点は何ですか?T& at(unsigned int)
ベクターオブジェクトat
を呼び出すことができないためです。const
非バージョンしかない場合はconst
、次のようになります。
const std::vector<int> x(10);
x.at(0);
コンパイルしません。バージョンを持つことconst
でこれが可能になり、同時にat
返されるものを実際に変更することができなくなります。これは契約によるものです。これはベクトルがconst
.
非const
バージョンは非const
オブジェクトで呼び出すことができ、返された要素を変更できます。これは、ベクトルが const ではないため有効です。
const std::vector<int> x(10);
std::vector<int> y(10);
int z = x.at(0); //calls const version - is valid
x.at(0) = 10; //calls const version, returns const reference, invalid
z = y.at(0); //calls non-const version - is valid
y.at(0) = 10; //calls non-const version, returns non-const reference
//is valid