右值引用 右值 左值和 左值引用

首先注意lvalue 和rvalue 中的l  r 不是 left和right

而是

l = locator value 可以寻址的数据,明确一定是一个地址容纳一个数据,可以在该条语句后面再找到这个值

r= read value  不可寻址数据或者用来读取的数据

右值引用 会得到一个左值

x++ 右值; (产生一个临时变量返回,然后x+1)

++x左值;(先x+1再返回x)

左值引用依然得到左值,就是起一个别名 符号是&

int a=10;

int &b=a;

此时 b和a地址在内存中是相同的。

右值引用得到一个左值,符号是 &&

可以理解为用一个变量去保存这个临时变量。对于类类型不用多次调用拷贝构造函数(主要用途)。

int && c=10 是可行的

所以得到的c是一个左值

这样写意义不大。但是对于一个类。

比如 class A 有一个+方法

A a,b

A c=a+b 和A &&c=a+b就有区别了。

第一种

A c=a+b  先调用 a+b产生了一个临时对象 temp. 然后再调用了拷贝构造函数 c=temp

第二种 A &&c=a+b就没有产生这个temp 而是直接用c去接受了这个 +的值 没有产生多的拷贝构造函数。

std::move干的就是这个事情。将一个左值转换成一个右值引用,减少拷贝,但是原。

#include

#include

#include

using namespace std;

int main()

{

    string str = "hello";

    cout << "before str: " << str << endl;

    vector vstr;

   vstr.emplace_back(std::move(str));

    cout << "after  str: " << str << endl;

    return 0;

}

比如这个move 将原来str的所有权转移直接变成了vstr的参数放进去。同时原str变成了空字符串。

这个类需要实现移动构造函数 移动赋值函数 A(A&& r)    A operator= (A&& r); 

一些使用的坑

c++的坑 -- 移动构造函数 和 移动赋值运算符 - 知乎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值