Si vous vous demandez comment initialiser un vecteur constant pour qu'il ait un contenu intéressant, la réponse est probablement d'utiliser le constructeur copy. D'abord, vous remplissez laborieusement un vecteur, puis vous créez votre nouveau vecteur constant à partir de celui-ci. Vous pouvez également utiliser le modèle de constructeur vector<InputIterator>(InputIterator, InputIterator) pour initialiser à partir d'un autre type de conteneur ou d'un tableau. S'il s'agit d'un tableau, celui-ci peut avoir été défini avec une liste d'initialisation.
On peut espérer que quelque chose comme ça se rapproche de ce que vous voulez :
const T ra[3] = {t1, t2, t3};
const vector<const T> v(ra, ra+3);
Si vous demandez comment passer un vecteur constant dans une fonction qui prend un vecteur, la réponse est l'une ou l'autre :
- vous ne pouvez pas, car la fonction pourrait modifier le vecteur et votre objet/référence est const. Faites une copie non-const de l'original, et passez-la.
ou
- utiliser const_cast pour supprimer la constance afin de le passer dans une fonction qui prend un vecteur non-const mais dont vous savez pertinemment qu'elle ne modifiera pas le vecteur.
Ce dernier point fait partie de ces choses qui, à juste titre, amèneront tous ceux qui le verront à faire des commentaires sur les lunettes et le fait qu'elles ne font rien. C'est exactement ce à quoi sert const_cast, mais il y a un argument assez fort qui dit que si vous avez besoin de const_cast, vous avez déjà perdu.
Faire ces deux choses (créer un vecteur constant à partir d'un vecteur non constant avec le constructeur de copie, et ensuite enlever la constance) est définitivement incorrect - vous auriez dû simplement utiliser un vecteur non constant. Choisissez donc au maximum l'une de ces choses à faire...
Edition : je viens de remarquer que vous parlez d'une différence entre vector<T> et const vector<const T>. Malheureusement, dans la STL, vector<const T> et vector<T> sont des types complètement indépendants, et le seul moyen de les convertir est de les copier. Il s'agit d'une différence entre les vecteurs et les tableaux - un T** peut être converti silencieusement et en toute sécurité en const T *const *].