非 const 引用必须用与该引用同类型的对象初始化,且不能初始化为右值(如字面值常量):
int ival = 1024;
int &refVal = ival; // ok: refVal refers to ival
int &refVal2; // error: a reference must be initialized
int &refVal3 = 10; // error: initializer must be an object
const 引用则可以绑定到不同但相关的类型的对象或绑定到右值:
int i = 42;
// legal for const references only
const int &r = 42;
const int &r2 = r + i;
原因:
(例)假如我们编写
double dval = 3.14;
const int &ri = dval;
编译器会把这些代码转换成如以下形式的编码:
int temp = dval;
const int &ri = temp;
如果 ri 不是 const,那么可以修改ri,但是因为ri实际上指向temp,所以修改ri不会修改 dval,
而是修改了temp。期望对 ri 的赋值会修改 dval 的程序员会发现 dval 并没有被修改。
反之,如果ri 是 const,因为无法修改ri,从而使用ri的程序员从来不会试图通过修改ri来修改dval,
所以,不会出现“期望对 ri 的赋值会修改 dval 的程序员会发现 dval 并没有被修改”这样的错误。