Le modèle vecteur STL définit accesseurs des éléments à la fois comme const et variantes non const, par exemple:const et non-const dans des conteneurs stl
reference operator[](size_type __n)
{return *(this->_M_impl._M_start + __n);}
const_reference operator[](size_type __n) const
{return *(this->_M_impl._M_start + __n);}
Quand le compilateur décide d'utiliser une seule version sur l'autre? Le vecteur lui-même n'est pas défini comme const, ni les éléments y sont stockés. Donc, étant donné deux fonctions:
A f(int i) const
{ return myVector[i]; }
A f(int i)
{ return myVector[i]; }
Ma compréhension est que la première appelleraient la version const de l'opérateur [] et retourner un const A. La deuxième appelle la version non-const et retourne un non-const A?
Pour moi, la première version de f() semble être la "correcte" à écrire puisque la fonction ne modifie rien, mais il est peut-être surprenant pour l'appelant qu'il renvoie un const A. Certainement si Je voulais un const un retour, je besoin de définir f() comme:
const A f(int i) const //Note the extra const at the start
{ return myVector[i]; }
Ce qui raconterait celui qui est en train d'écrire l'appelant d'attendre un retour const.
Donc le bonus additionnel apparaît par magie? Et à quoi sert le const supplémentaire si j'utilise boost :: ptr_vector plutôt que std :: vector? Les données? Le pointeur? tous les deux?
Vous feriez mieux de poser une question générale sur 'const'. Mieux encore, étudiez ceci dans votre manuel C++ et essayez des exemples de programmes, puis posez des questions sur des problèmes concrets. Quel manuel utilisez-vous? –