Если T
- любой тип, то есть два связанных указателя типа, T *
и const T *
.
Вы получаете указатели по своей природе, беря "адрес-"некоторый объект типа T
.Тип указателя зависит от константности объекта:
T x;
const T y;
T * p1 = &x; // OK, &x is T*
// T * p2 = &y; // Error!
const T * q1 = &y; // OK, &y is const T *
const T * q2 = &x; // also fine
Таким образом, если у нас есть изменяемый объект, указатель на него, естественно, является указателем на изменяемый объект.Однако, если у нас есть только постоянный объект, тогда указатель может быть только указателем на константу.Поскольку мы всегда можем обращаться с изменяемым объектом как с постоянным (просто не трогать), указатель на изменяемый объект всегда можно преобразовать в указатель на постоянное значение, как в случае q2
.
Вот что происходит с вашим k
: это const T *
(с T = Node
), и мы присваиваем ему значение T *
, что хорошо, так как мы просто игнорируем тот факт, чтомы могли бы мутировать T
, если бы захотели.
[В реальной жизни у нас обычно есть постоянные ссылки , а не постоянные объекты, но вы можете относиться к ним по существу как к тем жевещь (поскольку ссылка - это просто псевдоним для объекта и функционально идентична самому объекту).]
Теперь вы можете путать все эти const
с константойсам объект: так же, как раньше у нас были x
и y
, одна изменяемая и одна константа, мы можем применить ту же логику к самому типу указателя: давайте определим P = T *
и Q = const T *
.Тогда в приведенном выше коде все наши объекты были изменяемыми объектами P p1, p2; Q q1, q2;
.То есть мы всегда можем изменить любой из указателей, чтобы он указывал куда-то еще: q2 = &z;
.Нет проблем.Это то, что вы делаете с k
при его переназначении.
Конечно, мы также можем объявить константу версии этих указателей: const P p3 = &x; const Q q3 = &y;
.Эти не могут быть переназначены (в конце концов, будучи постоянными).Если вы изложите это в терминах T
, как обычно делают люди, это звучит немного громко:
T * p3 const = &x;
const T * q3 const = &y;
Я надеюсь, что это не создало больше путаницы, чем решило!