Якщо ви запитуєте, як ініціалізувати вектор const, щоб він мав цікавий вміст, тоді відповідь, мабуть, полягає у використанні конструктора копіювання. Спочатку ви наполегливо заповнюєте вектор, а потім створюєте з нього новий вектор const. Або ви можете використовувати vector<InputIterator>(InputIterator, InputIterator)
шаблон конструктора для ініціалізації з якогось іншого типу контейнера або масиву. Якщо масив, то це можна було б визначити за допомогою списку ініціалізації.
Щось подібне, сподіваємось, близьке до того, що ви хочете:
const T ra[3] = {t1, t2, t3};
const vector<const T> v(ra, ra+3);
Якщо ви запитуєте, як передати вектор const у функцію, яка приймає вектор, тоді відповідь:
- ви не можете, оскільки функція може змінити вектор, а ваш об'єкт / посилання - const. Зробіть неконстируючу копію оригіналу та передайте її.
або
- використовуйте
const_cast
для видалення constness, щоб передати його у функцію, яка приймає вектор, який не є const, але про який ви знаєте, не буде змінювати вектор.
Останнє - одна з тих речей, яка, цілком справедливо, змусить кожного, хто бачить це, коментувати окуляри та той факт, що вони нічого не роблять. Це саме те const_cast
, для чого, але є досить вагомий аргумент, який говорить, що якщо вам потрібно const_cast
, ви вже програли.
Робити обидві ці речі (створювати вектор const з неконстантного за допомогою конструктора копіювання, а потім відкидати constness), безумовно, неправильно - вам слід було просто використовувати вектор, який не є const. Тож виберіть щонайбільше одне з них, щоб зробити ...
[ Редагувати: щойно помітив, що ви говорите про різницю між vector<T>
і const vector<const T>
. На жаль , в STL, vector<const T>
і vector<T>
абсолютно не пов'язані між собою види, і єдиний спосіб перетворення між ними шляхом копіювання. Це різниця між векторами та масивами - a T**
можна безшумно та безпечно перетворити в const T *const *
]