Questo non funziona:
char** p2p2c;
const char** p2p2cc = p2p2c; //fail
Se questo è stato permesso si sarebbe permesso di rompere const correttezza:
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;
Se l'assegnazione è stato permesso, si consentirebbe impostando un puntatore non-const (intermedio) per riferirsi a un valore costante, probabilmente causando un comportamento indefinito in modo non ovvio per vedere. Disabilitando quell'operazione il sistema di tipi è più sicuro.
ma questo fa:
const char * const * p2cp2cc = p2p2c; //fine
Questo va bene, poiché il puntatore intermedio è fisso, non è possibile ripristinare il puntatore intermedio per fare riferimento a un oggetto const e rompere const correttezza
fonte
2013-09-05 13:44:05
L'ultimo esempio compilerà solo in C++, ma non in C. – AnT
@AndreyT perché così? – emesx
Questo è solo il modo in cui è in C e C++. Si tratta di due lingue diverse con regole di const-correctness diverse. In C++ 'T **' è convertibile in 'const T * const *'. In C 'T **' è convertibile in 'T * const *', ma non in 'T * const *'. http://stackoverflow.com/a/5249001/187690 – AnT