• 先来解释下为什么没有引用常量,假设有int& const a;代表这个常量是一个引用类型下的常量,这显然是矛盾的。因为引用本身不是对象,则引用不可能有常量
  • 常量的引用可以直接赋予它字面值,非常量不可以。
1 int& r1 = 42;//错误,非常量引用的初始值必须为左值
2 const int& r2 = 42;
  • 常量的引用可以绑定非常量的对象(不能通过常量的引用来修改对象的值),非常量的引用不可以绑定常量的对象。
1 int a = 42;
2 const int c = 43;
3 
4 int& r1 = c;//错误,将 "int &" 类型的引用绑定到 "const int" 类型的初始值设定项时,限定符被丢弃
5 const int& r2 = a;
6 r2 = 24;//错误,表达式必须是可修改的左值

注意当常量的引用绑定了一个非const修饰的变量时,常量的引用不可以对其进行修改。但是当这个非const修饰的变量被一个非常量的引用进行绑定时,非常量的引用可以对其进行修改。

  • 常量的引用可以绑定常量引用的表达式和非常量引用的表达式,非常量的引用都不可以。
int a = 42;
const int c = 43;

int& r1 = a;
const int& r2 = c;

const int& r3 = r1 * 5;
const int& r4 = r2 * 5;

int& r5 = r1 * 5;//错误,非常量引用的初始值必须为左值
int& r6 = r2 * 5;//错误,非常量引用的初始值必须为左值
  • 常量的引用可以绑定与之类型不同的变量,非常量的引用不可以。
1 double b = 42.0;
2 
3 const int& r2 = b;
4 int& r1 = b;//错误,无法用 "double" 类型的值初始化 "int &" 类型的引用(非常量限定)

 对第一个常量的引用加以解释,编译器做了如下操作:

1 double b = 42.0;
2 
3 //强制类型转换转换结果的类型是等号左边的变量的类型,因此b被转换成了int类型
4 const int temp = b;
5 const int& r2 = temp;

 其实temp也发生了转换,即从int类型转换成const int &;而普通引用没有const int temp=b的这一步,即没有从double转换成int这一步。

posted on 2023-04-14 17:30  小凉拖  阅读(196)  评论(0编辑  收藏  举报