关于 move(sample).fun() 的思考

std::move主要通过类型转换将对象转化为右值引用,从而允许移动而不是拷贝。它并不执行实际的内存交换,而是提供一种方式来表明对象可以被安全地移动。在std::move(sample)之后,sample成为泛左值,仍能访问成员函数fun(),整个过程不涉及构造或析构。
摘要由CSDN通过智能技术生成

sample是个类, fun()是其子函数。

std::move()的根本

最初接触到std::move,以为std::move具有类似于swap功能,可以避免内存的拷贝。后来查看资料发现,std::move的实现并没有交换内存的操作。

那么std::move是如何避免内存拷贝的呢?
需要看它的源码实现,std::move只是进行了左右值的转换,也就是类型的转换,并没有改变对象本身。

如上这句话涉及两件事情

  • std::move的源码实现
  • 左右值概念

​ 为了避免直接看源码比较困难, 先学习下前置知识, 即左右值概念。

左值右值介绍请看如下链接文件

std::move 的函数原型

/**
 *  @brief  Convert a value to an rvalue.
 *  @param  __t  A thing of arbitrary type.
 *  @return The parameter cast to an rvalue-reference to allow moving it.
*/
template<typename _Tp>
  constexpr typename std::remove_reference<_Tp>::type&&
  move(_Tp&& __t) noexcept
  { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }

remove_reference请看如下链接文件

可见std::move() 其实仅进行了 static_cast 强制类型转换, 给转化为右值引用类型进行返回。

综上

std::move(sample) 是一个右值引用, 即泛左值, 此时可以进行.fun()的访问。

且此过程中未涉及到构造和析构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值