std::move以及右值引用等

在这里只能给出 s t d : : m o v e std::move std::move一个比较通俗的看法,不能从原理上深挖,真是惭愧。不过这里面涉及到一些小 t r i c k trick trick,还是挺有意思的。
先说 s t d : : m o v e std::move std::move的两个用法:

第一种:
vector<int> a = {1,2,3,4};
vector<int> b = std::move(a);
printf("%d",a[0]);

这个时候会报段错误

第二种:
vector<int> a = { 1,2,3,4 };
vector<int>&& b = std::move(a);
printf("%d", a[0]);

这个时候可以正常打印

根本原因就是 s t d : : m o v e std::move std::move之后的类型为右值引用,如果把他赋值给一个右值引用,那么它的值不会被窃取,如果赋给一个左值,那么它的值就会被窃取。

再看下面这个例子:

在这里插入图片描述
这个例子事实上应该成功窃取,并且是一个浅拷贝,但是前后地址并不一样,原因就是这个字符串太短了,应该放在栈上,而move不会把栈上的东西浅拷贝,所以做了深拷贝。如果把这个长度加长,嘟嘟嘟嘟,成功啦!复制指针哇咔咔!
在这里插入图片描述
这个例子详见 B B B站:
这里
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值