将一种类型的对象分配给其他类型的引用变量不起作用

时间:2012-08-03 11:19:33

标签: c++

请考虑以下代码:

#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???
}

为什么b分配给a是好的,但b分配给ref是非法的???

1 个答案:

答案 0 :(得分:4)

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

这使您可以将类型为B的对象转换为A类型的对象。但是,无法从其他类型T&创建引用L

  

8.5.3参考文献[dcl.init.ref]

     
      
  1. 声明为T&T&&的变量,即“类型T的引用”(8.3.2),应由对象初始化,或类型为T的函数或可转换为T的对象。

  2.   
  3. [...]

  4.   
  5. [...]

  6.   
  7. 给定类型“cv1 T1”和“cv2 T2”,“cv1 T1”与“cv2 T2”引用相关,如果{{ 1}}与T1的类型相同,或T2T1的基类。 “cv1 T2”与“cv2 T1”引用兼容,如果T2T1引用相关且cv1与cv资格相同或更高cv - 资格比,cv2 [...]。

  8.   

在您的示例中,T2A都不是同一类型,B也不是A的基类,因此这两个类都与引用无关。

为什么B不起作用?

表达式A &ref = (A)b实际上会创建一个临时的,不能绑定到普通引用:

  

错误:从“B”类型的临时值初始化“A&amp;”类型的非const引用

你需要一个const引用(A) b