4

なぜこれがコンパイルされないのか誰か教えてもらえますか?

struct A { };
struct B : public A { };

int main()
{
  B b;
  A* a = &b;
  B* &b1 = static_cast<B*&>(a);
  return 0;
}

ここで、静的キャストを次のように置き換えると、

B* b1 = static_cast<B*>(a);

その後、コンパイルします。

編集:コンパイラが独立した型として扱い、そうでない場合はこれが機能するA*ことは明らかです。B*問題は、なぜそれが望ましいのかということです。

4

4 に答える 4

7

Bから派生していますAが、からB*派生していませんA*。aへのポインタは、へのBポインタではなく、A1つにしか変換できません。ただし、型は区別されたままです(そして、変換によってポインターの値が変更される可能性があり、多くの場合、変更されます)。AB*&は、を参照することしかできずB*、他のポインタタイプを参照することはできません。

于 2013-01-17T16:03:41.740 に答える
3

非定数左辺値参照(B *&)は、無関係の型(A *)にバインドできません。

于 2013-01-17T15:47:38.833 に答える
0

にをキャストしようとしA*ていB*ます。これは間違った方法であり、あまり役に立ちません。派生へのポインタをベースへのポインタに格納することをお勧めします。これは便利で、キャストも必要ありません。

dynamic_castここでうまくいくかもしれないと思いますが、私が間違っていなければ、結果は実装定義になります。

于 2013-01-17T15:55:06.863 に答える
0

参照の処理はコンパイラーが行うことであり、参照にキャストする必要はありません。

コードを次のようにリファクタリングすると、次のようになります。

B b;
A* a = &b;
B* b_ptr = static_cast<B*>(a);
B*& p1 = b_ptr;

コンパイルされます。

于 2013-01-17T16:04:59.010 に答える