Nếu tôi làm như sau tất cả là ok:trống static_cast * char * vs static_cast trống ** char **
char* cp = "abc";
void* vp = NULL;
vp = static_cast<void*>(cp);//ok
cp = static_cast<char*>(vp);//ok
Nhưng đây không phải là:
char** cpp = &cp;
void** vpp = NULL;
vpp = static_cast<void**>(cpp);//error C2440: 'static_cast':
//cannot convert from 'char **' to 'void **'
cpp = static_cast<char**>(vpp);//error C2440: 'static_cast':
//cannot convert from 'void **' to 'char **'
Hãy thể ai đó giải thích cho tôi tại sao các ví dụ thứ hai không được phép. Xin vui lòng không trích dẫn tiêu chuẩn C++ như câu trả lời của bạn, bởi vì tôi đã nhìn thấy câu trả lời trích dẫn nó, và tôi không hiểu ý nghĩa của chúng. Tôi muốn hiểu lý do tại sao ví dụ thứ hai không hoạt động (ví dụ: nếu bạn có thể đưa ra một ví dụ về việc sẽ rất nguy hiểm khi đó sẽ là một trợ giúp lớn). Bởi vì tôi không hiểu. Với tôi, cả hai ví dụ đều là con trỏ. Tại sao một mức độ khác biệt của indirection tạo ra bất kỳ sự khác biệt nào?
Bạn có thể chuyển đổi hoàn toàn bất kỳ con trỏ nào thành 'void *' và tĩnh đúc theo hướng ngược lại. Nhưng điều này không đúng với 'T *' và 'U *' nói chung, điều này không liên quan. (Bây giờ hãy suy nghĩ 'T = char *' và 'U = void *'.) –
Bạn có thể tạo một 'char **' thành 'void *' và ngược lại. –
@Kerrek SB - Có, nhưng tại sao điều này lại không được phép? Khi nào điều này sẽ không an toàn? – e244