4

reinterpret_cast に関連する奇妙なエラーに遭遇しました。以下のコードを見てください:

int* var;
reinterpret_cast<void const **>(&var);

VSC++2010 のエラー: エラー C2440: 'reinterpret_cast': 'int ** ' から 'const void ** ' に変換できません

gcc 4.1.2 のエラー: タイプ 'int** ' からタイプ 'const void** ' への reinterpret_cast は constness をキャストします

gcc 4.6.2 のエラー: タイプ 'int** ' からタイプ 'const void** ' への reinterpret_cast は修飾子をキャストします

const をキャストしているとコンパイラが言う理由を誰もが知っていますか。私と同僚の何人かは、何が問題なのかわかりません。

手伝ってくれてありがとう!

4

2 に答える 2

9

C++03 標準のセクション 5.2.10 では、reinterpret_cast の機能について説明しています。「reinterpret_cast 演算子は constness をキャストしてはならない」と明示的に述べています。

const のキャスト アウェイは、C++03 標準のセクション 5.2.11 で定義されています。そこで使用されている表記法は少し紛らわしいですが、基本的には、指定された修飾に対する暗黙的な変換がない場合、2 つの型の間のキャストは "constness をキャストする" と述べています。

あなたの場合、 を に変換しようとしint **ていvoid const**ます。コンパイラは「との間T **で暗黙的に変換できますか?」とT const**尋ねますが、答えは「いいえ」なので、constness をキャストしていると言えます。

ここでのロジックは、修飾子を変更するのではなく、型の変更を処理するように reinterpret_cast が作成されていることです (これが const_cast の目的です)。そのため、const_cast が必要な何かを実行するように要求すると、拒否されます。

于 2013-02-01T15:45:19.097 に答える
2

を追加/削除するconstには、 を使用しますconst_cast

紛らわしいキャスト エラーに対処するには、一度に 1 ステップずつ実行します。

int* var;
int** v2 = &var;
int const** v3 = const_cast<int const**>(v2);
void const** v4 = reinterpret_cast<void const**>(v3);

int const**aと aは非常に異なる型であり、それらの間の変換は危険であることに注意してください-- <->int**よりも危険です。void*int*

があるとしますint** bobint const** alice次に、を介してを受け取る関数に渡しますconst_cast

その関数では、読み取り専用メモリに格納されている int へのポインタを*alice-- 完全に合法です。

bob関数の外で、とが有効であることを確認して*bobから に代入し**bob、読み取り専用メモリに書き込もうとしました。

于 2013-02-01T15:46:46.363 に答える