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); }
可见std::move() 其实仅进行了 static_cast 强制类型转换, 给转化为右值引用类型进行返回。
综上
std::move(sample) 是一个右值引用, 即泛左值, 此时可以进行.fun()的访问。
且此过程中未涉及到构造和析构。