这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
之前的内容主要来源于C++ Premier Plus的阅读和理解,其实手头还有一本Effective Modern C++,介绍了C++11/14的新特性,是一本不错的读物。有人将C++11/14的主要新特性概括为:auto推导、智能指针、移动语义与完美转发、lambda表达式。auto推导和智能指针前面研究过,来看看移动语义这块。
std::move
有关std::move,看到的文章大多花了大量篇幅来讲明白这个概念,这两篇文章是我看到比较好的:一文读懂C++右值引用和std::move,什么是move?理解C++ Value categories,move, move in Rust,当然,手头有本Effective Modern C++是最好的。快速过几个有关std::move的关键点。
变量
对于常见的一些数据结构,一般采用一部分放在栈里(如数组指针),另一部分放在堆里,实际存储的数组元素。栈上的数据可称为handle,用来控制(handle)堆里面的数据——所以它是堆数据的所有者(owner)。在JS、python,JAVA等有GC的语言中,赋值操作就是所谓的"move",即把变量名指向堆中的元素,而C++进行赋值操作会在堆中新开辟一块并把原来的内存复制一块给新变量。因而JS面试题中常考的拷贝,其实在C++中是常规操作。而相应的,C++有时也需要去实行JS中的常规操作,即"move"
左值和右值
简单地说,左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。 比如:
int a = 5;
这里a是左值,5是右值。
但是由于引用的存在和右值引用的引入,会让情况复杂点,与"move"相关的是,有些值可以直接被"move",而有些值需要被转换。这里的细节不表。
std::move干了啥
template<typename T>
typename removeReference<T>::type&&
move(T&& param){
using ReturnType =
typename removeReference<T>::type&&;
return static_cast<ReturnType>(param)
这是Effective Modern C++中给出的接近std::move的实现,它就干了一件事:把实参转换为一个引用。
移动语义
待施工。。。