- 先来解释下为什么没有引用常量,假设有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这一步。