浅识:【C++11】右值引用

引入右值引用的目的:为了支持移动操作和完美转发。目的:解决临时对象的问题,提高效率。

区分左值和右值:

左值跟右值都是针对表达式而言的;
左值:指表达式结束后依然存在的持久对象,变量是左值。
右值:指表达式结束时就不再存在的临时对象,右值是可以取出地址的,要么是字面常量,要么是表达式求值过程中创建的临时对象。
左值持久,右值短暂

例子:对于int a = 10;

++a和a++的区别:

a++:先将a的持久对象拷贝一份,然后是持久对象a的值+1;最后返回的是那份拷贝的对象;所以他是右值。
++a:直接使持久对象的值+1,返回持久对象,所以他是左值。

所谓右值引用就是必须绑定到右值的引用。我们通过&&而不是&来获取右值引用。
重要性质:只能绑定一个将要销毁的对象。

int a = 10;     //a为左值,10为右值
int &r = a;     //正确:r引用a
int &&rr = a;   //错误:不能将一个右值引用绑定到一个左值上
int &r1 = a * 42;//错误:a*42是一个右值(当前语句执行完后a*42的值就不在了)
const int& r2 = a * 42;//正确:可以将一个const的引用绑定到一个右值上。
int &&rr1 = a * 42;//正确:将rr1绑定到乘法结果上
不能将一个右值引用绑定到一个右值引用类型的变量
int &&rr2 = 42;//正确:字面常量是右值
int &&rr3 = rr1;//错误:表达式rr1是左值,无法将右值引用绑定到左值

变量是左值;不能将一个右值引用直接绑定到一个变量上,即使这个变量是右值引用类型也不行

标准move函数:

解决不能将一个右值引用绑定到一个左值的方法
1,显示地将一个左值转换为对应的右值应用类型:
例如:

int a = 10;
int && rr = (int &&)a; //正确

2,调用move函数,获得绑定到左值上的右值引用。
例如:

const int a = 10;
int &&rr1 = 10;
int &&rr2 = std::move(a);//正确
int &&rr3 = std::move(rr1);正确

move告诉编译器:我们有一个左值,但是我们希望像一个右值一样处理它。
我们必须认识到,调用move就意味着有一个承诺:除了对 rr1 赋值或者销毁它外,我们将不能在使用,调用move后,我们不能对移后源对象的值做任何假设。

猜你喜欢

转载自blog.csdn.net/prefect_boy/article/details/79907927