To nie działa:
char** p2p2c;
const char** p2p2cc = p2p2c; //fail
Jeśli pozwolono by mieć prawo do zerwania const-poprawności:
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;
Jeśli zadanie było dozwolone, byś umożliwić ustawianie wskaźnika niestałego (pośredniego) w celu odniesienia do wartości stałej, co może spowodować niezdefiniowane zachowanie w sposób nieoczywisty, aby zobaczyć. Przez uniemożliwienie tej operacji system typów jest bezpieczniejszy.
ale to robi:
const char * const * p2cp2cc = p2p2c; //fine
Jest to dobre rozwiązanie, ponieważ pośredni wskaźnik jest ustalony, nie jest możliwe, aby zresetować pośredni wskaźnik odnosi się do const obiektu i złamać const-poprawności
Ostatnim przykładem będzie skompilować tylko w C++, ale nie w C. – AnT
@AndreyT dlaczego tak? – emesx
Tak właśnie jest w C i C++. Są to dwa różne języki z różnymi regułami poprawności stałych. W C++ 'T **' można przekształcić na 'const T * const *'. W C 'T **' można zamienić na 'T * const *', ale nie na 'T * const *'. http://stackoverflow.com/a/5249001/187690 – AnT