Почему контейнеры STL определяют константные и неконстантные версии средств доступа?
В чем преимущество определения const T& at(unsigned int i) const
и T& at(unsigned int)
, а не только неконстантной версии?
Почему контейнеры STL определяют константные и неконстантные версии средств доступа?
В чем преимущество определения 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 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