Пока это компилируется:
char* p2c;
const char* p2cc = p2c; //fine
потому что в указанном типе lhs есть все определители остроконечного типа rh, это не так:
char** p2p2c;
const char** p2p2cc = p2p2c; //fail
но это делает:
const char * const * p2cp2cc = p2p2c; //fine
Почему именно это происходит?