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;
}

这将使您能够将 type 的对象转换为 typeB的对象A。但是,T&不能从其他类型创建引用L

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

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

  2. [...]

  3. [...]

  4. 给定类型“cv1 T1”和“cv2” ,如果“cv1”与“cv2”类型相同,或者是“cv2 ”的基类,则“cv1”与“ T2cv2 T1”引用相关。如果“cv1 ”与“cv2 ”引用相关,并且 cv1 与 cv2 具有相同的 cv-qualification 或大于 cv2 [...],则“cv1”与“cv2”是引用兼容的。T2T1T2T1T2T1T2T1T2

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

为什么A &ref = (A)b行不通?

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

错误:从“B”类型的临时变量中“A&”类型的非常量引用的初始化无效</p>

您需要为此提供 const 参考A const & ref = (A)b

于 2012-08-03T11:21:36.603 回答