funktioniert das nicht:
char** p2p2c;
const char** p2p2cc = p2p2c; //fail
Wenn das durfte man const-Korrektheit zu brechen erlaubt sein würde:
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;
Wenn die Zuweisung erlaubt wurde, würde es Ihnen ermöglichen, Setzen eines nichtkonstanten Zeigers (intermediate), um auf einen konstanten Wert zu verweisen, was möglicherweise undefiniertes Verhalten in einem nicht offensichtlichen Weg verursacht. Durch das Verbot dieser Operation ist das Typsystem sicherer.
aber dies tut:
const char * const * p2cp2cc = p2p2c; //fine
Das ist in Ordnung, da die Zwischenzeiger befestigt ist, ist es unmöglich, den Zwischen Zeiger zurückgesetzt auf ein konstantes Objekt zu beziehen und brechen const-Korrektheit
Das letzte Beispiel kompiliert nur in C++, aber nicht in C. – AnT
@AndreyT warum so? – emesx
Genau so ist es in C und C++. Dies sind zwei verschiedene Sprachen mit unterschiedlichen Konstanten für die Korrektheit. In C++ ist 'T **' konvertierbar nach 'const T * const *'. In C 'T **' ist konvertierbar in 'T * const *', aber nicht in 'T * const *'. http://StackOverflow.com/a/5249001/187690 – AnT