này không hoạt động:
char** p2p2c;
const char** p2p2cc = p2p2c; //fail
Nếu được cho phép, bạn sẽ được phép phá vỡ const-đúng đắn:
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;
Nếu việc chuyển nhượng được cho phép, bạn sẽ cho phép thiết lập một con trỏ không const (trung gian) để tham chiếu đến một giá trị không đổi, có thể gây ra hành vi không xác định trong một không rõ ràng để xem cách. Bằng cách không cho phép hoạt động đó, hệ thống kiểu an toàn hơn.
nhưng điều này không:
const char * const * p2cp2cc = p2p2c; //fine
này là tốt, kể từ khi con trỏ trung gian là cố định, nó là không thể để thiết lập lại con trỏ trung gian để đề cập đến một đối tượng const và phá vỡ const-đúng đắn
Nguồn
2013-09-05 13:44:05
Ví dụ cuối cùng sẽ chỉ biên dịch trong C++, nhưng không phải trong C. – AnT
@AndreyT tại sao như vậy? – emesx
Đó chỉ là cách thức của nó trong C và C++. Đây là hai ngôn ngữ khác nhau với các quy tắc const-correctness khác nhau. Trong C++ 'T **' có thể chuyển đổi thành 'const T * const *'. Trong C 'T **' có thể chuyển đổi thành 'T * const *', nhưng không chuyển thành 'T * const *'. http://stackoverflow.com/a/5249001/187690 – AnT