9

int *pt = 0;
long i = reinterpret_cast<long>(pt);

私は0であることが保証されていますか?これは明確に定義されていますか、それとも実装で定義されていますか?私はc++標準をチェックしましたが、それはそれだけを述べています

データオブジェクトまたは関数へのポインタ(ただし、メンバーへのポインタではない)は、それを含むのに十分な大きさの任意の整数型に変換できます。

この場合、ptはデータオブジェクトを指していません。ルールはこの場合に適用されますか?

4

4 に答える 4

8

いいえi必ずしも値ではありません。結果は実装定義です。†</sup>

C ++でのポインターの表現は、nullポインターの表現を含め、実装によって定義されます。ゼロの整数値をポインターに割り当てるときは、そのポインターを実装定義のヌルポインター値に設定します。これは、必ずしもすべてビットゼロである必要はありません。その値を整数にキャストした結果は、推移性によって実装によって定義されます。

ただし、さらに厄介なのは、によって行われるマッピングがreinterpret_cast とにかく実装定義されていることです。したがって、nullポインタ値がすべてビットゼロであったとしても、実装は自由に結果を自由に作成できます。キャストバックしたときに元の値が得られることが保証されているだけです。

とはいえ、引用の後の次の文には次のメモが含まれています。

[注:基礎となるマシンのアドレス指定構造を知っている人にとっては驚くことではありません。—エンドノート]

したがって、特定のマッピングは必要ありませんが、実際には、知識に基づいた推測を行うことができます。


†</sup>long十分に大きいと仮定します。C ++ 0xではuintptr_t、オプションでで定義されているを使用し<cstddef>ます。

于 2011-04-12T19:59:40.560 に答える
0

なぜそうならないのかわかりません。問題は、問題の整数型がそれほど高い値を保持できないことですが、それがnullポインターであれば、問題はありません。

于 2011-04-12T19:50:54.560 に答える
0

はい、実行時にどこを指すかは問題ではありません。重要なのはポインタのタイプだけです。「データオブジェクトまたは関数へ」とは、「通常の」オブジェクトポインタと関数ポインタ(つまり、オブジェクトコードへのポインタ)の両方を数値型に再キャストできることを意味します。

上記のコードは、すべての既知の一般的なプラットフォームで0から「i」を安全に格納していると思います。

于 2011-04-12T19:52:03.483 に答える
0

reinterpret_cast(pt)が必要ですが、はい、それは機能します。reinterpret_castは、古いCスタイルのキャスト(long)と同じであり、自分が何をしているかを知っていることを前提としています。

于 2011-04-12T19:52:32.410 に答える