C++primer移动构造函数笔记
c++支持移动而非拷贝一个对象的能力。在很多情况下我们都会拷贝一个对象,对象在拷贝后就立即销毁了。这种情况下使用移动会大幅度提升性能。
什么是移动
移动一个对象就是直接将它使用的内存交由另一个对象使用。类似于用一个指针指向另一个指针指向的对象,不同的是移动后的对象只支持赋新值和销毁操作,不能再依赖于之前的值。
右值引用
了解移动之前我们必须了解什么是右值引用(&&),右值引用就是必须绑定到右值的引用。右值引用有一个重要的性质–只能绑定到一个将要销毁的对象。右值引用有和左值引用相反的绑定特性,右值引用可以绑定到要求转换的表达式字面常量或是返回右值的表达式。
int i=0;
int &&r1=i; //错误,不能绑定到左值
int &&r2=100;//正确,可以绑定到字面常量
int &&r3=i*42;//正确,可以绑定到返回右值的表达式
因为右值引用只能绑定到临时对象,我们可以从绑定到右值引用的对象窃取“状态”。使用右值引用的代码可以自由接管所引用对象的资源。
move函数介绍
虽然我们不能将右值直接绑定到一个左值上,但我们可以使用标准库函数move来将一个左值显式的转换成一个右值引用类型。
int &&r4=std::move(i);
调用move代表告诉编译器,我们希望像一个右值一样使用它。所以在对象调用move函数后,我们不能在使用它的值,只能对它赋予一个新的值,或者销毁它。