0

次のコードを検討してください。

#include <iostream>
using namespace std;
class B{
public:
  B(){}
};
class A
{
public:
A(){}
A(B &b){

}
A(const B &b){
       cout<<"cccddd"<<endl;
}
};
int main()
{
   B b;
   A c(b);
   A a;
   a=b; //ok
   A &ref = b; //error and why???
}

なぜaに割り当てられたbは問題ないのに、refに割り当てられたbは違法ですか?

4

1 に答える 1

4
A(const B &b){
       cout<<"cccddd"<<endl;
}

Bこれにより、 type のオブジェクトを type のオブジェクトに変換できますA。ただし、T&別の型から参照を作成することはできませんL

8.5.3 参照 [dcl.init.ref]

  1. T&orとして宣言された変数T&&、つまり「型への参照T」 (8.3.2) は、型 T のオブジェクトまたは関数、または T に変換できるオブジェクトによって初期化されなければなりません。

  2. [...]

  3. [...]

  4. 型「cv1 T1」および「 cv2」が与えられた場合T2、「cv1 」は「cv2」と同じ型であるか、またはの基底クラスである場合T1に参照関連です。「cv1 」は、「cv2 」と参照互換であり、cv1 が cv2 と同じ cv 修飾であるか、cv2 より大きい cv 修飾である場合 [...]。T2T1T2T1T2T1T2T1T2

あなたの例ではAB同じタイプでもA基本クラスでBもないため、両方のクラスは参照関連ではありません。

なぜうまくいかないA &ref = (A)bのですか?

(A) bは実際には、通常の参照にバインドできない一時的なものを作成します。

エラー: タイプ 'B' のテンポラリからのタイプ 'A&' の非 const 参照の無効な初期化</p>

これには const 参照が必要ですA const & ref = (A)b

于 2012-08-03T11:21:36.603 に答える