Несмотря на то, что у нас уже есть очень хорошие ответы на это, я решил внести более практичный ответ, чтобы показать, что может и что не может быть сделано.
Так что это не работает:
vector<const T> vec;
Просто прочитайте другие ответы, чтобы понять, почему. И, как вы, возможно, догадались, это тоже не сработает:
vector<const shared_ptr<T>> vec;
T
больше не const
, но vector
удерживает shared_ptr
s, а не T
s.
С другой стороны, это работает :
vector<const T *> vec;
vector<T const *> vec; // the same as above
Но в этом случае const указывает объект, на который указывает, а не самого указателя (что и хранит вектор). Это было бы равнозначно:
vector<shared_ptr<const T>> vec;
Что хорошо.
Но если мы положим const
в конец выражения, теперь он превращает указатель в const
, поэтому следующее не будет компилироваться:
vector<T * const> vec;
Немного сбивает с толку, согласен, но вы привыкли к этому.