問題タブ [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.
c++ - CスタイルのキャストではなくC++reinterpret_castを使用する必要がありますか?
次のテンプレート関数を使用して、任意の標準タイプのデータをバイナリ出力ストリームにダンプします。
reinterpret_castの代わりに、Cスタイル(const char *)を使用することもできます。reinterpret_castを使用する特別な理由はありますか?reinterpret_castが眉をひそめた他のいくつかの投稿を読みました。しかし、上記の使用法は合法であり、他のものに置き換えることはできませんよね?
c++ - 再解釈を使用した整数へのポインター
reinterpret_cast を使用してポインタを別の型にキャストしようとしています
たとえば、MyClassA へのポインターを MyClassB にキャストする場合、reinterpret_cast を使用するとこの変換は機能しますか? コードの移植性はどうですか?
また、私が指摘したように:
(5.2.10/4) ポインターは、それを保持するのに十分な大きさの任意の整数型に明示的に変換できます。
MyClassA*
int* ポインターにのみ変換できるなど、任意のポインターを意味しますか? 私が正しいなら?
c++ - 再解釈キャストの動作のための GCC 実装
GCCコンパイラでキャスト作業を再解釈する方法を知るにはどうすればよいですか? ドキュメントに記載されていますか?参照またはリンクが存在する場合、私はそれを知ることができますか?
c++ - 関数へのポインターを関数型への別のポインターに変換した結果
(5.2.10 / 6)C ++ 03関数へのポインターは、別のタイプの関数へのポインターに明示的に変換できます。関数の定義で使用されている型と同じではない関数型(8.3.5)へのポインターを介して関数を呼び出す効果は未定義です。タイプ「pointertoT1」の右辺値をタイプ「pointertoT2」(T1とT2は関数型)に変換し、元のタイプに戻すことを除いて、元のポインター値が生成されます。このようなポインター変換の結果は指定されていません。 。[注:ポインター変換の詳細については、4.10も参照してください。]
以下は私がやろうとしていることですが、に変換fp1
した結果がfp2
元のポインターを生成することは明らかですが、同時に標準の表現は次の"The result of such a pointer conversion is unspecified"
ようになります。それはどういう意味ですか?
c++ - char*変換およびエイリアシングルール
厳密なエイリアシングルールによると:
異なるタイプのオブジェクトへのAchar*
は有効です。しかし、今の問題は、&dの同じアドレスを指しているのでしょうか?同じアドレスを返すというC++標準による保証は何ですか?
c++ - 多重継承とこのポインタ
私がこの構造体を持っているとしましょう:
vector_dataはPODタイプであるため、operator[]は期待どおりに機能するはずです。予想される動作は、vector_data [0]がxを返し、vector_data[1]がyを返すことです。
ここで、2番目の構造体があるとします。
そして、このように両方から派生します:
これにより、operator []の予想される動作が破壊されますか?言い換えると、派生構造体のvector_dataのthisポインターは、引き続き構造体のvector_data部分を指しますか、それとも派生構造体の先頭を指しますか?
それがoperator[]を破壊する場合、どうすればこの問題を解決できますか?最初にvector_dataから継承できますが、composedに仮想関数が含まれているとします。ほとんどのコンパイラがvtableを最後に置くことは知っていますが、これは保証されていません。最善のアプローチは何でしょうか?
c++ - このreinterpret_castを取り除くにはどうすればよいですか、またはこの使用法は問題ありませんか?
この署名を持つテンプレートメンバー関数があります:
型の引数を受け入れる関数へのポインタを使用して呼び出すことができますT*
。context
その関数に渡されます。実装は次のとおりです。
使用reinterpret_cast<>
して動作します。問題は、規格がそれをうまく定義しておらず、非常に危険であるということです。どうすればこれを取り除くことができますか?試しstatic_cast
ましたが、コンパイラエラーが発生しました。
static_cast
fromvoid (*)(std::__1::basic_string<char> *)
todispatch_function_t
(akavoid (*)(void *)
)は許可されていません。
dispatch_function_t
はCタイプで、と同じvoid (*)(void*)
です。
十分にはっきりしていたかどうかはわかりません。指定されたコールバック関数をdispatch_sync_f
呼び出し、指定されたコンテキストパラメータをそのコールバック関数に渡します。(これは別のスレッドで行われますが、この質問の範囲外です。)
c++ - オブジェクトIDに乱数を選択しますか?
参照カウントの基本クラスを実装していて、そのインターフェイスを継承する作成中のオブジェクトごとに一意の番号を設定したいと思います。
そのクラスのコードスニペットは次のとおりです。
ヘッダ:
CPP:
それが安全なアプローチであるかどうか、そうでない場合はどうしてですか?私は2つの理由でrandとsrand関数を使用しませんでした:
- srand AFAIKは、プロジェクトで1回だけ使用して、可能な限り乱数をランダムにするのが最適です。
- 2つのオブジェクトが同じメモリ位置を共有できないため、このアプローチはより正確です。
アドバイスしてください。
編集:どの時点でメンバーobject_idが作成されますか?コンストラクターの内部または外部(初期化リストの前または後)hm hm?どうもありがとう!
c++ - ポインターの reinterpret_cast char と unsigned char の間の落とし穴?
UUID を作成し、事前に割り当てられたバッファーに人間が読める形式で書き込むために、次の関数を使用しています。何かがおかしい。
メソッドの最後に、デバッガーは次のように言います。
- lDest = 0x01fe4fd8 "df4a5ed8-c0d2-495a-84d7-ce0e07cf2113"
- pdst = 0x0012ec7c ""ìetoodhealthouseledefhe「
どちらも同じ内容かと思っていましたが、そうではありません。
どうしたの?ありがとう。
c++ - c++ reinterpret_cast、virtual、およびテンプレートは大丈夫ですか?
C++ では、次のクラス階層を想定しています。
さらに、共通のテンプレート化された基本クラスを持つこれら 2 つのクラスのファクトリ クラスを想定します。
と のサイズ/内部構造はChildClassFactory
、BaseClassFactory
フィールドが異なるため異なることに注意してください。
ChildClassFactory
に(または)のインスタンスがある場合、Factory<ChildClass>
安全にFactory<BaseClass>
(経由でreinterpret_cast
) にキャストできますか?
テンプレート化されたクラスを常にこのようにキャストできるとは限らないことは知っていますが、この特別なケースでは、キャストは安全であるべきですよね?
Visual C++ 2010 でテストしましたが、動作します。私の質問は、これが他のコンパイラに移植可能かどうかです。
更新:いくつかの混乱があったので、私の例で重要な (と思われる) ものをもう少し明確にさせてください:
ChildClass
の子クラスですBaseClass
- のユーザーは、
Factory<BaseClass>
のどの子クラスが作成されるかを知りませんBaseClass
。彼が知っているのは、それBaseClass
が作成されたということだけです。 Factory<T>
独自のフィールドはありません (vtable 以外)。Factory::create()
はvirtual