C++11——右值引用

来源:互联网 发布:iphone电池不耐用 知乎 编辑:程序博客网 时间:2024/06/04 19:51

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;    //编译错误

因此可以通过函数重载的方式来确定:函数有左值或右值为参数的时候,看是否能被同名且对应参数为左值或有值引用的函数所重载。

0 0