请考虑以下代码:
#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是非法的???
答案 0 :(得分:4)
A(const B &b){
cout<<"cccddd"<<endl;
}
这使您可以将类型为B
的对象转换为A
类型的对象。但是,无法从其他类型T&
创建引用L
。
8.5.3参考文献[dcl.init.ref]
声明为
T&
或T&&
的变量,即“类型T
的引用”(8.3.2),应由对象初始化,或类型为T的函数或可转换为T的对象。[...]
[...]
- 醇>
给定类型“cv1
T1
”和“cv2T2
”,“cv1T1
”与“cv2T2
”引用相关,如果{{ 1}}与T1
的类型相同,或T2
是T1
的基类。 “cv1T2
”与“cv2T1
”引用兼容,如果T2
与T1
引用相关且cv1与cv资格相同或更高cv - 资格比,cv2 [...]。
在您的示例中,T2
和A
都不是同一类型,B
也不是A
的基类,因此这两个类都与引用无关。
B
不起作用?表达式A &ref = (A)b
实际上会创建一个临时的,不能绑定到普通引用:
错误:从“B”类型的临时值初始化“A&amp;”类型的非const引用
你需要一个const引用(A) b
。