5

STL コンテナーが const および非 const バージョンのアクセサーを定義するのはなぜですか?

非 const バージョンだけでなく、const T& at(unsigned int i) const定義する利点は何ですか?T& at(unsigned int)

4

1 に答える 1

10

ベクターオブジェクト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
于 2012-11-20T18:18:05.573 に答える