Ответ 1
Это не работает:
char** p2p2c;
const char** p2p2cc = p2p2c; //fail
Если это разрешено, вам будет разрешено нарушить const-correctness:
const int k = 10;
int *p;
int **pp = &p;
int const **kpp = pp; // Should this be allowed, if so:
*kpp = &k; // fine, kpp promises not to change it
// yet this does p = &k;
// p made no such promise! this is a hidden const_cast!
*p = 5;
Если присваивание разрешено, вы должны включить настройку указателя неконстантного (промежуточного), чтобы ссылаться на постоянное значение, что может привести к поведению undefined неочевидным образом. Не разрешая эту операцию, система типов более безопасна.
но это делает:
const char * const * p2cp2cc = p2p2c; //fine
Это нормально, поскольку промежуточный указатель исправлен, невозможно reset промежуточный указатель ссылаться на объект const и нарушать const-correctness