C++中左值与右值

1.一个简单定义

lvalue代表一个在内存中占有确定位置的对象(换句话说就是有一个地址),可以把左值当成有名字的对象,所有的变量,包括常变量,都是左值。。
rvalue通过排他性来定义,每个表达式不是lvalue就是rvalue。因此从上面的lvalue的定义,rvalue是在不在内存中占有确定位置的表达式。

我的理解是出现在运算符=左边的为左值,右边的为右值。

2.左值引用

可以把左值引用当成对象的另一个名字,lvalue引用声明由一个可选的说明符列表和一个引用声明符组成。

引用必须初始化,而且不能改变。

一个对象的地址可以 转化成 一种指定类型的指针 或者 转化成 一个 相似类型的引用。意义是相同的。

char val='c';
char& r_val=val;

3.右值引用

右值引用使您能够区分左值和右值。Lvalue引用和rvalue引用在语法和语义上是相似的。

右值引用支持移动语义的实现,可以显著提升应用程序的性能。移动语义允许您编写将资源(例如动态分配的内存)从一个对象传输到另一个对象的代码,移动语义行之有效,因为它允许从程序中其他地方无法引用的临时对象转移资源。

为了实现移动语义,你在类中提供一个动态构造,和可选择的动态赋值运算符(operator=)。拷贝和赋值操作的资源是右值的可以自动调用移动语义。不像缺省的拷贝构造,编译器并不提供缺省的动态构造。

//必须传入常量
void print(int &&data)
{
    data=1001;//可以修改形参 cout<<data<<endl; }

 

上一篇:渲染管线流程


下一篇:zset如何解决内部链表查找效率低下