Зачем иметь константные и неконстантные методы доступа?

Почему контейнеры STL определяют константные и неконстантные версии средств доступа?

В чем преимущество определения const T& at(unsigned int i) const и T& at(unsigned int), а не только неконстантной версии?


person Vincent    schedule 20.11.2012    source источник
comment
Возможный дубликат той же функции с константой и без - когда и почему?   -  person underscore_d    schedule 21.11.2017


Ответы (1)


Потому что вы не сможете вызвать at для векторного объекта const.

Если у вас была только версия, отличная от const, то следующее:

const std::vector<int> x(10);
x.at(0);

не будет компилироваться. Наличие версии const делает это возможным и в то же время не позволяет вам фактически изменить то, что возвращает at, что по контракту, поскольку вектор равен 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
person Luchian Grigore    schedule 20.11.2012