Причина, по которой const
может быть добавлена только на один уровень, является тонкой и объясняется Вопросом 11.10 в comp.lang.c FAQ .
Вкратце, рассмотрите этот пример, тесно связанный с вашим:
const int i;
int *p;
int const **z = &p;
*z = &i;
/* Now p points to i */
C избегает этой проблемы, только разрешая присваивать отбрасывать квалификаторы на первом указанном уровне (поэтому присвоение z
здесь не допускается).
Ваш конкретный пример не страдает от этой проблемы, потому что const
второго уровня означает, что присвоение *z
не будет разрешено в любом случае. C ++ допустил бы в этом конкретном случае, но более простые правила C не различают ваш случай и пример выше.