Pourquoi les conteneurs STL définissent-ils les versions const et non-const des accesseurs?
Quel est l’avantage de définir const T& at(unsigned int i) const
et T& at(unsigned int)
et pas seulement la version non const?
Parce que vous ne pourriez pas appeler un object vectoriel const
.
Si vous ne const
version non const
, les éléments suivants:
const std::vector x(10); x.at(0);
ne pas comstackr. Avoir la version const
rend cela possible et vous empêche en même temps de changer réellement ce qui est retourné – ce qui est contractuel, puisque le vecteur est const
.
La version non const
peut être appelée sur un object non const
et vous permet de modifier l’élément renvoyé, ce qui est également valide car le vecteur n’est pas const.
const std::vector x(10); std::vector 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