您的位置:首页 > 编程语言 > C语言/C++

左值引用和右值引用

2017-10-22 11:01 246 查看

左值引用和右值引用

为了支持移动语义和完美转发,C++标准引入了一种新的引用类型——右值引用(rvalue reference)。

为了与右值引用区分开来,我们将常规引用称为左值引用(lvalue reference)。

对于左值引用而言,我们不能将其绑定到要求类型转换的表达式,字面值常量或是返回右值的表达式。

但是对于右值引用而言,情况则完全相反。我们可以将一个右值引用绑定到字面值常量或是返回右值的表达式上,但是不能将一个右值引用直接绑定到一个左值上。

返回引用的函数,连同赋值、下标、解引用以及前置递增/递减运算符,都是返回左值的表达式的例子。我们可以将一个左值引用绑定到这类表达式的结果上。

返回非引用类型的函数,连同算术、关系、位以及后置递增/递减运算符,都生成右值。我们不能将一个左值引用绑定到这类表达式上,但是我们可以将一个const左值引用或一个右值引用绑定到这类表达式上。

所谓右值引用就是必须绑定到右值的引用。

由前面可知,右值要么是字面值常量,要么是在表达式求值过程中创建的临时对象。

所以,我们得知:

右值引用所绑定的对象将要被销毁。

右值引用所绑定的对象没有其他用户。

这就意味着,右值引用只能绑定一个将要销毁的对象。因此,我们可以从绑定到右值引用的对象“窃取”状态(为移动语义和完美转发作铺垫)。

此外,由于变量是左值,因此我们不能将一个右值引用直接绑定到一个变量上,即使这个变量是右值引用类型也不行。

我们将通过&&而不是&来获得右值引用。

int i = 42;
int &r = i;
int &&rr = i; //错误,不能将一个右值引用绑定到一个左值上
//cannot bind ‘int’ lvalue to ‘int&&’

int &r2 = i * 42; //错误,不能将一个非const的左值引用绑定到一个右值上
//invalid initialization of non-const reference of type ‘int&’
//from an rvalue of type ‘int’

const int &r3 = i * 42;
int &&rr2 = i * 42;

int &&rr3 = 42;
int &&rr4 = rr3; //错误,不能将一个右值引用绑定到一个左值上,rr3是一个左值
//cannot bind ‘int’ lvalue to ‘int&&’
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息