C++中的引用允许你为以及存在的对象创建一个新的名字。对新引用所做的访问和修改操作,都会影响到它的原型(被引用的对象)。
例如:
int var = 2;
int& ref = var;
ref = 9;
// ref = 9;
// var = 9;
这种方式被称为左值引用——对左值的引用。左值这个概念来源与C语言,指的是可以放在赋值表达式左边的事物——在栈上或堆上分配的命名对象,或者其它有明确的内存地址的对象成员。右值这个概念也来自C语言,值的是可以出现在赋值表达式右侧的对象——例如,文字常量和临时变量。因此,左值引用只能被绑定在左值上,而不是右值。
例如下面这样写是错的:
// 编译错误
int& num = 1;
但是你可以使用下面的这种方式来对一个右值进行引用:
const int& i = 1;
i是一个const左值,之所以可以这样写,是因为发生了隐式转换。就像我们可以对左值的const引用创建临时性的对象,并将其作为参数传递给函数。比如:
void print(const string& s);
print("hello"); //创建了string的对象
在C++11标准中介绍了右值引用(rvalue reference),这种方式只能绑定右值,不能绑定左值,它通过两个&&来进行声明:
int&& i = 1;
int j = 42;
int&& k = j; //编译错误
因此可以通过函数重载的方式来确定:函数有左值或右值为参数的时候,看是否能被同名且对应参数为左值或有值引用的函数所重载。