なぜこのreinterpret_castはコンパイルできないのでしょうか?
質問
私は、以下のことを理解しています。
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ではありません。
関連
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] reinterpret_castはいつ使うのか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み】CとC++におけるユニオンの目的