12

そのようなキャストにreinterpret_cast演算子を使用できないのはなぜですか?

enum Foo { bar, baz };

void foo(Foo)
{
}

int main()
{
   // foo(0); // error: invalid conversion from 'int' to 'Foo'
   // foo(reinterpret_cast<Foo>(0)); // error: invalid cast from type 'int' to type 'Foo'
   foo(static_cast<Foo>(0)); 
   foo((Foo)0);
}
4

2 に答える 2

22

これは、すべてのタイプのキャストに使用できると思いますreinterpret_cast。これは、この変換のすべての副作用を伴う別のタイプへのキャストを強制するためです。

それはよくある誤解です。で実行できる変換reinterpret_castは、標準の5.2.10に明示的にリストされています。int-to-enumおよびenum-to-int変換はリストにありません:

  • 整数がそれを保持するのに十分な大きさである限り、整数型へのポインタ
  • nullptr_t整数に
  • 整数型またはenumポインタへ
  • 異なるタイプの別の関数ポインタへの関数ポインタ
  • 異なるタイプの別のオブジェクトポインタへのオブジェクトポインタ
  • nullptr_t他のポインタタイプへ
  • との両方がオブジェクトまたは関数である場合T1の、の別のメンバーへのポインターへのポインターT2T1T2

reinterpret_cast通常、コンパイラに通知するために使用されます。ねえ、メモリのこの領域はであると思いますが、 (とは無関係のタイプである)Tとして解釈してください。UTU

reinterpret_castビットに影響を与える可能性があることも注目に値します。

5.2.10.3

[注:reinterpret_castによって実行されるマッピングは、元の値とは異なる表現を生成する場合と生成しない場合があります。—エンドノート]

Cスタイルのキャストはstatic_cast、その試行に含まれているため、常に機能します。

于 2012-09-01T14:34:21.037 に答える
4

通常の列挙型の基になる型はであるため、再解釈intするものはありません。この場合、静的キャストが適切な変換です。

于 2012-09-01T14:33:53.377 に答える