Jeśli pytasz, jak zainicjować wektor const, aby miał interesującą zawartość, to prawdopodobnie odpowiedzią jest użycie konstruktora kopiującego. Najpierw mozolnie wypełniasz wektor, a następnie tworzysz z niego nowy wektor const. Lub możesz użyć vector<InputIterator>(InputIterator, InputIterator)
szablonu konstruktora do zainicjowania z innego rodzaju kontenera lub tablicy. Jeśli tablica, to można ją zdefiniować za pomocą listy inicjalizacyjnej.
Mam nadzieję, że coś takiego jest bliskie temu, czego chcesz:
const T ra[3] = {t1, t2, t3};
const vector<const T> v(ra, ra+3);
Jeśli pytasz, jak przekazać wektor const do funkcji, która przyjmuje wektor, odpowiedź brzmi:
- nie możesz, ponieważ funkcja może zmienić wektor, a twój obiekt / odniesienie jest const. Utwórz kopię oryginału niebędącą stałą i przekaż ją.
lub
- użyj
const_cast
do usunięcia stałej, aby przekazać ją do funkcji, która pobiera wektor inny niż stała, ale o której wiesz, że nie zmodyfikuje wektora.
Ta ostatnia jest jedną z tych rzeczy, które całkiem słusznie sprawią, że każdy, kto to zobaczy, będzie komentował gogle i fakt, że nic nie robią. Właśnie po to const_cast
jest, ale istnieje dość silny argument, który mówi, że jeśli potrzebujesz const_cast
, już przegrałeś.
Robienie obu tych rzeczy (tworzenie wektora const z innego niż const za pomocą konstruktora kopiującego, a następnie odrzucanie stałej) jest zdecydowanie złe - powinieneś był po prostu użyć wektora innego niż const. Więc wybierz co najwyżej jedno z nich do zrobienia ...
[ Edycja: właśnie zauważyłem, że mówisz o różnicy między vector<T>
i const vector<const T>
. Niestety w STL vector<const T>
i vector<T>
są całkowicie niepowiązane typy, a jedynym sposobem na konwersję między nimi jest kopiowanie. To jest różnica między wektorami a tablicami - a T**
można dyskretnie i bezpiecznie przekonwertować na const T *const *
]