C++11新特性 右值引用



左值引用和右值引用的区别?右值引用的意义?

区别:

按照名字:左值引用就是对左值的引用,右值就是对右值的引用
按照功能
左值引用是为了防止对象的拷贝,

  • 函数传参

  • 函数返回值(拷贝函数)

右值引用(C++11):

  • 实现移动语义
  • 实现完美转发

左右值

可以在等号的左边可以取地址为左值,只能在等号右边,不能取地址为右值

左值:

左值是一个数据的表达式(如变量名或引用的指针),我们可以获取到它的地址,正常情况下是可以能够对它赋值,定义const修饰后的左值,不能给它赋值,但是可以取出它的地址。
常见的左值类型如下:

  • 变量名
  • 返回左值的函数调用
  • 前置自增/自减
  • 赋值运算或者符合赋值运算
  • 解引用
int a = 1//a为左值,a具有地址&a
int i = 0++i = 10//a为左值,因为i具有地址
A *a = new a; //*a,解引用依然是左值

右值:

右值也是一个数据表达式,右值是字面常量或者是求值过程种创建的临时对象,右值的生命周期是短暂的,右值不能出现在赋值符号的左边,右值也不能取出地址,更不能对它赋值。

右值的引用语法:
int&& rra = x +y; //正确
rra = 20;         //正确,普通的右值可以被更改
int&& rrb = x;   //错误,右值应用不能引用左值
const int&& rrc = 10;
rrc = 20          //错误,const引用不能更改
int&& rrd = rra; //错误,右值的引用不能被别的右值引用

标准库中的move函数可以将一个左值强制转换为右值

纯右值
  • 字面值
  • 返回非引用类型的函数调用
  • 后置自增自减
  • 算数表达式
  • 逻辑表达式
  • 比较表达式

纯右值的概念等同于我们之前所理解的右值,指的是临时变量或字面量值;而将亡值是C++11新引入的概念,它依托于右值。

  • 将亡值

i+&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
右值引用和move语义是C++ 11中重要的特性之一,可以提高程序的效率和性能。右值引用是一种新的引用类型,其绑定到临时对象或将要销毁的对象上,而不是左值对象。move语义则是利用右值引用,将一个对象的资源所有权从一个对象转移到另一个对象,避免了不必要的内存拷贝,提高了程序的效率。 下面是一个使用右值引用和move语义的例子: ```c++ #include <iostream> #include <vector> using namespace std; vector<int> getVector() { vector<int> v = {1, 2, 3, 4}; return v; } int main() { vector<int> v1 = getVector(); // 拷贝构造函数 vector<int> v2 = move(v1); // 移动构造函数 cout << "v1 size: " << v1.size() << endl; // 输出 0 cout << "v2 size: " << v2.size() << endl; // 输出 4 return 0; } ``` 在上面的例子中,getVector函数返回一个临时对象vector<int>,该临时对象是一个右值。在主函数中,我们使用拷贝构造函数将临时对象的值拷贝到v1中,然后使用move函数将v1中的值移动到v2中。由于move函数使用了右值引用,将v1中的资源所有权转移到了v2中,避免了不必要的内存拷贝,提高了程序的效率。最后,我们输出v1和v2的大小,可以看到v1的大小为0,v2的大小为4,说明资源已经成功转移。 需要注意的是,使用move语义之后,原对象的值会被移动到新对象中,并且原对象的值会被置为默认值(例如,对于vector而言,原对象的大小为0)。如果需要保留原对象的值,则需要在移动之前先进行一次拷贝操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值