問題タブ [reinterpret-cast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
qt - Qt-カスタムポインタを引数として取るスロットを呼び出す
Qtのシグナルとスロットをハックしようとしていますが、QMetaType::invokeMethodが呼び出されているスロットにポインター引数を正しく渡さないという問題が発生しました。
それから私はそれを次のように呼びます:
どこclass MyObject : public QObject { ... }
。私もしQ_DECLARE_METATYPE(MyObject *)
ますqRegisterMetaType<MyObject *>("MyObject *")
何が起こるかというと、レシーバーのスロットが呼び出されていますが、引数の値は、 as0
に何を渡しても常に重要です。call(...)
Q_ARG
好奇心から、レシーバーの自動生成されたMOCファイルを調べたところ、スロットが次のコードで呼び出されていることがわかりました。
の値が。_a[1]
の適切なアドレスを持っていることがわかりますMyObject *
。しかし、reinterpret_cast
それをに変え0
ます。
今、私は次の質問があります:
1)プログラムでスロットを呼び出し、ポインタ引数がスロットに適切に渡されるようにするにはどうすればよいですか?2)これは*reinterpret_cast< MyObject*(*)>(_a[1])
どういう意味ですか?余分な括弧の(*)
意味と、このコードの解釈方法は?
c++ - 低レベルのバイト操作を扱う場合、reinterpret_cast は悪いですか?
私は websocket サーバーを作成しており、マスクを解除する必要があるマスクされたデータを処理する必要があります。
マスクは unsigned char[4] で、データも unsigned char* バッファです。
私はバイトごとに XOR したくありません。一度に 4 バイトずつ XOR したいのです。
この状況で reinterpret_cast を使用すると何か問題がありますか?
別の方法は、明確ではなく、高速ではない次のコードです。
私は、C++ 11 の機能に依存するものを含め、代替案に耳を傾けています。
c++ - std::pair をキャストしていますconst& から std::pair へコンスト&セーフ?
プログラマーが特殊化のような奇妙なことを意図的に行っていないと仮定すると、reinterpret_cast
astd::pair<T1, T2> const &
を a に(理論上または実際に) 安全に使用できますか?std::pair<T1 const, T2> const &
std::pair<T1 const, T2>
c++ - const_cast と reinterpret_cast の比較
SO C++ FAQ を参照するstatic_cast、dynamic_cast、および reinterpret_cast はいつ使用する必要がありますか? .
const_cast は、変数に const を削除または追加するために使用され、constness を削除する唯一の信頼できる定義済みの合法的な方法です。reinterpret_cast は、型の解釈を変更するために使用されます。
const_cast のみを使用して const 変数を非 const にキャストする必要がある理由を合理的な方法で理解していますが、const_cast の代わりに reinterpret_cast を使用して constness を追加する問題の合理的な正当化を理解できません。
constness を追加するために reinterpret_cast を使用することは正気ではないことを理解していますが、constness を追加するために reinterpret_cast を使用することは、UB または潜在的な時限爆弾になるのでしょうか?
ここで私が混乱した理由は、ステートメントのためです
ほとんどの場合、reinterpret_cast で得られる唯一の保証は、結果を元の型にキャストした場合にまったく同じ値が得られるということです。
したがって、reinterpret_cast を使用して constness を追加し、結果を元の型に reinterpret_cast すると、結果は元の型に戻り、UB になるべきではありませんが、const_cast のみを使用して constness を削除する必要があるという事実に違反しています。
別の注意事項として、標準では、ケースの再解釈を使用して Constness を追加できることが保証されています。
5.2.10 キャストの再解釈 (7) ......「T1 へのポインター」型の prvalue v を「cv T2 へのポインター」型に変換すると、結果は static_cast(static_cast(v)) になります。および T2 は標準レイアウト タイプ (3.9) であり、T2 の配置要件は T1 の配置要件よりも厳密ではありません。
c++ - QObjectのサブリングにreinterpret_cast
ある種のオブジェクトファクトリ(テンプレートベース)があり、それは私の目的にはかなりうまく機能します。しかし今、私はQObjectと純粋な抽象クラス(インターフェース)の両方から派生したクラスを操作しようとしましたが、奇妙な実行時エラーが発生しました。
ここにこのクラスの簡単な図(派生)
およびderived.cppでのその実装:
voidポインターをインターフェースにキャストしようとすると、予期しない(私にとっては)動作が発生します。これは、実行時エラー、またはその他のメソッド呼び出し(クラスのサイズによって異なります)である可能性があります。
voidポインタをインターフェイスにキャストできない理由を教えてください。そして、回避策はありますか?
ご回答ありがとうございます
c++ - Pthreadとvoid*は、ジェネリックポインタの参照を解除しようとします
PRJをデバッグすると、次のエラーが発生します。
argsエラー:複数のエラーが報告されました。\ MIコマンドの実行に失敗しました:-var-create-
argsデバッガバックエンドからのエラーメッセージ:ジェネリックポインタを逆参照しようとしました。\変数オブジェクトを作成できません
void*argsからMapper*argにキャストするとエラーが発生します。
更新1
KMaster、KMapperは、それぞれMaster、Mapperを実装しますが、それらは何も追加しません。事実上、メソッドを呼び出すKMapperですwork()
。コードは次のとおりです。
誰かが助けてくれることを願っています!
更新2
デバッガーのスクリーンショット:
c++ - reinterpret_cast 中に値が変化する
reinterpret_cast を使用して整数を float に変換すると、メモリの内容が変化します。
例えば、
変数値 nTempest の 16 進表現は '42 a0 b6 ff' ですが、reinterpret_cast 後の fDest の内容は '42 a0 f6 ff' です。
この 3 番目のバイトが b6 から f6 に変更された理由を誰でも答えられるでしょうか。
c++ - uintをintにreinterpret_castできないのはなぜですか?
これが私がやりたいことです:
const int64_t randomIntNumber = reinterpret_cast<int64_t> (randomUintNumber);
ここで、randomUintNumberはタイプuint64_t
です。
エラーは(MSVC 2010)です:
エラーC2440:'reinterpret_cast':'constuint64_t'から'int64_t'に変換できません1>変換は有効な標準変換であり、暗黙的に、またはstatic_cast、Cスタイルのキャスト、または関数スタイルのキャストを使用して実行できます。
なぜコンパイルされないのですか?どちらのタイプも同じビット長ですが、reinterpret_castの目的ではありませんか?
c++ - reinterpret_cast - 奇妙な動作
reinterpret_cast に関連する奇妙なエラーに遭遇しました。以下のコードを見てください:
VSC++2010 のエラー: エラー C2440: 'reinterpret_cast': 'int ** ' から 'const void ** ' に変換できません
gcc 4.1.2 のエラー: タイプ 'int** ' からタイプ 'const void** ' への reinterpret_cast は constness をキャストします
gcc 4.6.2 のエラー: タイプ 'int** ' からタイプ 'const void** ' への reinterpret_cast は修飾子をキャストします
const をキャストしているとコンパイラが言う理由を誰もが知っていますか。私と同僚の何人かは、何が問題なのかわかりません。
手伝ってくれてありがとう!
c++ - メンバー関数へのポインターを char 配列に変換し、reinterpret_cast を使用して元に戻すことはできますか?
次のようなコードがあります。
set
完全なコンテキストでは、は常に次の と同じ型を使用していると確信できますget
。
これを安全に書き直して使用できますreinterpret_cast
か?
編集:
このコードは上記と同じことをしますか?