にキャストA*
したいchar*
場合とその逆の場合、2 つの選択肢があります (つまり、私たちの多くは 2 つの選択肢があると考えています。どちらも機能しているように見えるためです!したがって、混乱が生じます!):
struct A
{
int age;
char name[128];
};
A a;
char *buffer = static_cast<char*>(static_cast<void*>(&a)); //choice 1
char *buffer = reinterpret_cast<char*>(&a); //choice 2
どちらも正常に動作します。
//convert back
A *pA = static_cast<A*>(static_cast<void*>(buffer)); //choice 1
A *pA = reinterpret_cast<A*>(buffer); //choice 2
これでもうまくいきます!
では、連鎖した 2 つのジョブが機能するのに、なぜreinterpret_cast
C++ にあるのでしょうか。 static_cast
このトピックは、この投稿の下部にリストされているような以前のトピックと重複していると考える人もいるかもしれませんが、そうではありません。これらのトピックは理論的にしか議論していませんが、 が本当に必要な理由を示す例を 1 つも示していません。1 つの static_cast が失敗することに同意します。しかし、2つではどうですか?reintepret_cast
static_cast
2 つのチェーンの構文static_cast
が面倒に見える場合は、関数テンプレートを記述して、プログラマーにとってより使いやすくすることができます。
template<class To, class From>
To any_cast(From v)
{
return static_cast<To>(static_cast<void*>(v));
}
そして、これを次のように使用できます。
char *buffer = any_cast<char*>(&a); //choice 1
char *buffer = reinterpret_cast<char*>(&a); //choice 2
//convert back
A *pA = any_cast<A*>(buffer); //choice 1
A *pA = reinterpret_cast<A*>(buffer); //choice 2
any_cast
また、役立つ可能性があるこの状況を参照してください: fstream 読み取りおよび書き込みメンバー関数の適切なキャスト。
だから私の質問は基本的に、
- なぜ
reinterpret_cast
C++にあるのですか? - 連鎖した2つ
static_cast
が同じ仕事を確実に失敗する例を1つでも教えてください。