C++中const引用(reference to const)有一些特殊的用法,需要大家注意。对于普通引用,必须在初始化时绑定到一个类型一致的具名对象上。但const引用可以绑定到非常量对象、字面值、表达式,甚至其他可转换的类型上(类型不要求一致)。其中涉及临时对象的生成,对临时对象的修改不会反应到原始对象上,一定要注意。下面详细介绍。
本文参考C++ Primer第2章的相关示例对其需要注意的地方进行补充。
可以把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为对常量的引用,或const引用。与普通引用不同的是,对常量的引用不能被用来修改它所绑定的对象:
const int ci = 1024;
const int &r1 = ci; // 正确:引用及其绑定的对象都是常量
r1 = 42; // 错误:r1是对常量的引用
int &r2 = ci; // 错误:试图让一个非常量引用指向一个常量对象
因为不允许直接为ci赋值,当然也就不能通过引用去改变ci。因此,对r2的初始化是错误的。假设该初始化合法,则可以通过r2来改变它引用对象的值,这显然是不正确的。
与普通引用的初始化不同,在初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。尤其,允许为