私はちょうどこのスレッドを読んでいました: シンプルな c++ ポインターのキャスト
そして、中間ステップとして void* に static_cast しない限り、異なるポインター型間の static_cast が許可されない理由 (許可されている場合を除く)を考えるようになりました。両方またはどちらも許可されるべきではないように私には思えます。次に例を示します。
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*へのキャストは常に問題ありません。)
では、これらの可能性の 1 つが正しくないのはなぜですか? 2 と 3 の両方が許可されているか、どちらも許可されていないのでしょうか? 私の例に示すように代わりに機能するのはなぜですか?