Вы ошиблись. У вас есть изменяемый указатель на константу объект:
T const * p;
p = 0; // OK, p isn't const
p->mutate(); // Error! *p is const
T const & r = *p; // "same thing"
Что вам действительно нужно, так это константа указатель на изменяемый объект:
T * const p = &x; // OK, cannot change p
T & r = x; // "same thing"
p->mutate(); // OK, *p is mutable
Действительно, ссылки морально эквивалентны константным указателям, т.е. T &
против T * const
и константной версии T const &
против T const * const
.
Если вы настаиваете на том, чтобы получить какой-то совет, тогда я бы сказал: «Не используйте указатели».