Сначала поймите, что const T*
- это указатель на некоторый T
, который нельзя изменить.Второе, что нужно помнить, это то, что все члены фактически доступны через this->
.
. Итак (§9.3.1):
Нестатическая функция-член может быть объявлена как const, volatile,или const volatile.Эти cvqualifiers влияют на тип указателя this (9.3.2).
И что он делает (§9.3.2):
В теле нестатического(9.3) функция-член, ключевое слово this является выражением, не имеющим значения, значением которого является адрес объекта, для которого вызывается функция.Тип этого в функции-члене класса X - X *.Если функция-член объявлена как const, типом этого является const X *, если функция-член объявлена как volatile, типом этого является volatile X *, а если функция-член объявлена как const volatile, типом этого является constvolatile X *.
A const
для функции делает указатель this
const T*
.
. Вот почему эти примеры терпят неудачу: В варианте int&
,a
доступен как this->a
, this
- const T*
, поэтому a
- const int
.И const int
не может быть неявно преобразовано в int&
.То же самое с другой функцией.
Другими словами, когда функция имеет значение const
, она ударяет const
по всему классу, и вы не можете неявно отбрасывать const
.