1. ホーム
  2. c++

なぜこのreinterpret_castはコンパイルできないのでしょうか?

2023-11-05 05:54:12

質問

私は、以下のことを理解しています。 reinterpret_cast が危険であることは理解していますが、私はそれをテストするためにこれをやっているだけです。私は以下のようなコードを持っています。

int x = 0;
double y = reinterpret_cast<double>(x);

プログラムをコンパイルしようとすると、次のようなエラーが表示されます。

float' 型から 'double' 型への無効なキャストです。

どうしたんだろう?と思ったら reinterpret_cast はリンゴを潜水艦に変換するのに使える不正なキャストだと思ったのですが、なぜこの単純なキャストがコンパイルされないのでしょうか?

どのように解決するのですか?

おそらく、より良い考え方は reinterpret_cast は、"convert"できるルージュ演算子です。 ポインタ としてリンゴに ポインタ 潜水艦への

キャストによって返された値に y を代入することで、実際には値 x をキャストしているのではなく、変換しているのです。 つまり y が指しているのは x を指しておらず、floatを指しているように見せかけます。 変換は新しい型の float 型の新しい値を構築し、その値に x . C++でこの変換を行うにはいくつかの方法がありますが、そのうちのひとつです。

int main()
{
    int x = 42;
    float f = static_cast<float>(x);
    float f2 = (float)x;
    float f3 = float(x);
    float f4 = x;
    return 0;
}

唯一の違いは、最後のもの(暗黙の変換)は、より高い警告レベルでコンパイラの診断を生成することです。 しかし、これらはすべて機能的には同じことをするのです -- そして多くの場合 実際に は、同じマシンコードのように、同じことをします。

さて、もしあなたが本当に x が浮動小数点数であるかのように見せかけたいのなら、本当に x をキャストしたいのですが、このようにすると

#include <iostream>
using namespace std;

int main()
{
    int x = 42;
    float* pf = reinterpret_cast<float*>(&x);
    (*pf)++;
    cout << *pf;
    return 0;
}

これがいかに危険なことかおわかりいただけると思います。 実際、私のマシンでこれを実行したときの出力は 1 で、これは明らかに42+1ではありません。