c ++では、型または型の参照へのcキャストの違いは何ですか?
foo = (unsigned int) whatever;
// Is this the same as:
foo = (unsigned int&) whatever;
いいえ、まったく同じではありません。
(場合によっては、キャストの正確な性質が何であるかによって異なります。の型はとは無関係whatever
であると仮定します。)whatever
unsigned int
参照型への C キャストは、その型に対してunsigned int &
a を実行することと同等ですreinterpret_cast
foo = reinterpret_cast<unsigned int &>(whatever);
これは、定義上、
foo = *reinterpret_cast<unsigned int *>(&whatever);
whatever
この場合、左辺値である必要があります。
言い換えれば、参照へのキャストは、タイプ punningのもう 1 つの方法です。オブジェクトとして占有されているメモリを単純に再解釈しています。一般に、動作は未定義です。たとえば、が のサイズよりも小さい場合、再解釈には に属さない「野生の」メモリも含まれます。whatever
unsigned int
sizeof whatever
unsigned int
whatever
一方、非参照 C キャストは単なる値の変換であり、メモリの再解釈ではありません。への算術変換では、 unsigned int
it は と同等ですstatic_cast
(ただし、whatever
がポインターの場合は と同等ですreinterpret_cast
)。の値を読み取り、言語変換規則に従って型に変換whatever
します (変換が存在する場合)。unsigned int
たとえば、これ
float f = 5;
unsigned int i = (unsigned int) f;
の値をf
typeに変換します。これは、 value を受け取ることunsigned int
を意味します。同時に、あなたのプラットフォームのサイズと同じサイズの場合、これはi
5
unsigned int
float
unsigned int i = (unsigned int &) f;
は実際には、値を持つfloat
objectの内部オブジェクト表現を type のオブジェクトとして再解釈します。の結果の値は、一般に予測できません。通常、それは近くにさえありません(一般的な実装では、元の値の IEE754 表現を単純に受け取るだけです)。f
5
unsigned int
i
5
float
i