// 代码段 1
double a = 1.5;
const int & b = a; //必须有const不然报错
a = 2.5;
cout << a << " " <<b<< endl; // 输出 a = 2.5 b = 1;
// 代码段 2
int c= 2;
const int &d = c; // 可有可无const
c = 3;
cout << c << " " << d << endl; // 输出 a = 3 b =3
问题:1.为什么第一段代码必须有const?第二段中不用有const?
2.为什么第一段代码中a,b输出的值不同?而第二段中c,d的值相同?
原因:
1.在第一段中,a的值为double类型,而b是整形类型的对a的引用,所以,这个过程必定会发生隐式类型转换。
对于这段 const int & b = a; 代码,编译器会把这段代码变成如下形式
const int temp = a; // 隐式转换,生成中间temp,而这个temp是常量
const int &b = temp;
所以b必须为常量引用(因为中间生成的temp就是常量);而第二段代码中没有发生过隐式转换。
2.第一段中因为常量引用b引用的是中间生成的temp。改变a值,对b毫无影响。
第二段中常量引用d引用的是c,没有生成中间值,所以c改变,d也就改变了。