0

C ++標準では、これは実装で定義されていると述べており、元の型にキャストバック(を使用)すると元の値が最初に渡されることreinterpret_castを除いて、保証はありません。reinterpret_cast

少なくともいくつかのタイプのCスタイルのキャストは、ほとんど同じように動作します-同じ値で結果を前後にキャストします-現在、列挙とintsを使用していますが、他の例もいくつかあります。

C ++標準は両方のキャストスタイルにこれらの定義を提供しますが、混合キャストにも同じ保証を提供しますか?ライブラリXが関数からint Y()何らかの値を返す場合、Yの本体で初期値をenum変換するために使用されたキャストを気にせずに、上記のキャストのいずれかを使用できますか?私はXのソースコードを持っていないので、チェックできません(そして、とにかく次のバージョンで変更される可能性があります)、そしてそのようなことはドキュメントにほとんど言及されていません。enumint

このような場合のほとんどの実装では、両方のキャストが同じように動作することを私は知っています。私の質問は、C++標準はそのような場合について何と言っているのかということです。

4

3 に答える 3

4

C ++はstatic_castconst_castおよびの観点からCキャスト構文のセマンティクスを定義しますreinterpret_cast。したがって、それを実現するために使用する構文が何であれ、同じ操作に対して同じ保証が得られます。

于 2012-11-14T17:01:35.563 に答える
2

reinterpret_cast特定の変換にのみ使用できます。

  • (十分に大きい)整数へのポインター、およびその逆
  • 関数ポインタから関数ポインタへ
  • オブジェクトポインタからオブジェクトポインタへ
  • メンバーへのポインターからメンバーへのポインター
  • 参照する左辺値

プラス(条件付き)オブジェクトポインタへの関数ポインタとその逆。ほとんどの場合、変換された値は指定されていませんが、変換の後にその逆が続くと元の値が生成されることが保証されています。

reinterpret_cast特に、整数から列挙型を変換するために使用することはできません。変換は、十分に大きい整数型に対して適切に定義されているを使用してstatic_cast(または、スコープなしの列挙型を整数型に変換するときに暗黙的に)実行する必要があります。考えられる唯一の問題は、ライブラリが次のような完全に異常なことをした場合です。return reinterpret_cast<int&>(some_enum);

Cスタイルのキャストは、必要に応じて、static_castまたはのいずれかを実行しreinterpret_cast、その後に。を実行const_castします。したがって、によって明確に定義された変換static_castは、Cスタイルのキャストによっても明確に定義されます。

于 2012-11-14T17:48:29.037 に答える
1

いいえ、Cスタイルのキャストと同等でreinterpret_castはありません。Cスタイルのキャストでは、でconst_cast許可されていないconst-volatile(の機能を含む)をキャストできreinterpret_castます。static_castソースタイプとデスティネーションタイプの間で許可されている場合、static_castとは異なるセマンティクスを持つを実行しreinterpret_castます。変換が許可されていない場合は、にフォールバックしreinterpret_castます。最後に、Cキャストを他のキャストのいずれかで表すことができないというコーナーケースがあります。これは、アクセス指定子を無視します。

違いを説明するいくつかの例:

class b0 { int a; };
class b1 { int b; };
class b2 { int c; };
class d : public b0, public b1, b2 {};
int main() {
   d x;
   assert( static_cast<b1*>(&x) == (b1*)&x );
   assert( reinterpret_cast<b1*>(&x) != (b1*)&x ); // Different value
   assert( reinterpret_cast<b2*>(&x) != (b2*)&x ); // Different value, 
                                                   // cannot be done with static_cast
   const d *p = &x;
   // reinterpret_cast<b0*>(p);                    // Error cannot cast const away
   (b0*)p;                                         // C style can
}
于 2012-11-14T19:10:07.903 に答える