A const int *
и int *const
очень разные.Аналогично с const std::auto_ptr<int>
против std::auto_ptr<const int>
.Тем не менее, похоже, нет такого различия с const std::vector<int>
против std::vector<const int>
(на самом деле я не уверен, что второе даже разрешено).Почему это так?
Иногда у меня есть функция, которой я хочу передать ссылку на вектор.Функция не должна изменять сам вектор (например, no push_back()
), но она хочет изменить каждое из содержащихся значений (скажем, увеличить их).Точно так же я мог бы хотеть, чтобы функция только изменяла векторную структуру, но не изменяла любое из ее существующего содержания (хотя это было бы странно).Подобные вещи возможны с std::auto_ptr
(например), но поскольку std::vector::front()
(например) определяется как
const T &front() const;
T &front();
, а не просто
T &front() const;
Там нетспособ выразить это.
Примеры того, что я хочу сделать:
//create a (non-modifiable) auto_ptr containing a (modifiable) int
const std::auto_ptr<int> a(new int(3));
//this works and makes sense - changing the value pointed to, not the pointer itself
*a = 4;
//this is an error, as it should be
a.reset();
//create a (non-modifiable) vector containing a (modifiable) int
const std::vector<int> v(1, 3);
//this makes sense to me but doesn't work - trying to change the value in the vector, not the vector itself
v.front() = 4;
//this is an error, as it should be
v.clear();