Pourquoi avoir des accesseurs const et non-const?

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