Одна вещь, которая является «неправильной», заключается в том, что вы не можете преобразовать T ** в T const * const *, что должно быть разрешено, поскольку это не опасно. Недопустимо преобразование T ** в T const **, это преобразование недопустимо.
Я иногда упоминал, что const на самом деле является дешевым способом "разбить" ваш интерфейс на методы только для чтения и методы записи. Это было бы непрактично в C ++. В Java было бы более практично иметь версии коллекций ReadOnly, где они не имеют const и где их типы коллекций более объектно-ориентированы.
const-ness не распространяется: проблема здесь в том, что если я pImpl мой класс, constness не "проверяется" компилятором, то есть мой класс интерфейса может иметь метод "const", вызывающий неконстантный метод в pImpl и компилятор не будут жаловаться. Это потому, что единственное, что мой метод const гарантированно не сделает, это поменяет указатель на другой объект, и мой pImpl никогда не изменится. Это может быть даже указатель const (не указатель на const).
Отсутствие правильной ко-дисперсии между shared_ptr<T>
и shared_ptr<const T>
также может быть проблемой, хотя в целом я видел, что это не проблема, но разработчики обычно печатают определение своих shared_ptrs и редко вводят определение для shared_ptr Уст. И они иногда передают const shared_ptr<T> &
и думают, что передают общий указатель на const T (как с const T *), которым они не являются.