我只是在读这个线程: 简单的 C++ 指针转换
这让我想到为什么不允许不同指针类型之间的 static_cast (除非在这种情况下),除非您将 static_cast 转换为 void* 作为中间步骤。在我看来,两者都应该被允许,或者都不应该被允许。这是一个例子:
char* cs;
unsigned char* ucs;
cs = reinterpret_cast<char*>(ucs); // 1) allowed, of course
cs = static_cast<char*>(ucs); // 2) not allowed: incompatible pointer types
cs = static_cast<char*>( static_cast<void*>(ucs) ); // 3) now it's allowed!
在我看来,如果 #3 是可能的,那么 #2 也应该被允许。或者相反,如果由于指针不兼容(需要 reinterpret_cast)而不允许使用 #2,那么基于指针不兼容的原因,可能不允许从void* 到任何东西的 static_casting。(当然,从任何其他指针转换为void* 总是可以的。)
那么为什么这些可能性之一不是真的——#2 和#3 要么都被允许,要么都不被允许?为什么它会像我的示例中所示那样工作?