Если кто-то передает вам shared_ptr<const T>
, вы никогда не сможете изменить T
. Конечно, технически возможно привести const T
к T
, но это нарушает намерение сделать T
const
. Поэтому, если вы хотите, чтобы люди могли добавлять объекты в ваш класс, они должны давать вам shared_ptr<T>
, а не shared_ptr<const T>
. Когда вы возвращаете вещи из вашего класса, вы не хотите изменять, то есть когда вы используете shared_ptr<const T>
.
shared_ptr<T>
может быть автоматически преобразовано (без явного приведения) в shared_ptr<const T>
, но не наоборот. Это может помочь вам (и вы все равно должны это сделать) свободно использовать методы const
. Когда вы определяете метод класса const
, компилятор не позволит вам изменить ни один из ваших элементов данных или вернуть что-либо, кроме const T
. Таким образом, использование этих методов поможет вам убедиться, что вы что-то не забыли, и поможет пользователям вашего класса понять, какова цель метода. (Пример: virtual shared_ptr<const T> myGetSharedPtr(int index) const;
)
Вы правы в своем втором утверждении, вы, вероятно, не хотите создавать экземпляр своего класса как <const T>
, поскольку вы никогда не сможете изменить ни один из ваших T
s.