在对象拷贝后就立即被销毁的情况下,移动而非拷贝对象会大幅度提升性能。以及像 IO 类或 unique_ptr 这样的类,包含不能被共享的资源,不能拷贝但可以移动。而标准库容器、string 和 shared_ptr 类既支持移动也支持拷贝
右值引用:
右值引用是 c++11 为了支持移动操作引入的。右值引用就是只能绑定到右值的引用。我们通过 && 而非 & 来获取右值引用。右值引用只能绑定到一个将要销毁的对象。因此我们可以自由地将一个右值引用的资源 “移动” 到另一个对象中
类似任何引用,右值引用也是某个对象的别名。但右值引用有着与左值引用有着完全相反的引用特性:我们可以将一个右值引用绑定到要求转换的表达式、字面常量或是返回右值的表达式,但不能将一个右值引用绑定到一个左值上:
1 #include <iostream> 2 using namespace std; 3 4 int main(void){ 5 int i = 42; 6 int &r = i;//正确,r引用i 7 // int &&rr = i;//错误,不能将一个右值引用绑定到一个左值上 8 // int &r2 = i *42;//错误,i*42 是一个右值表达式 9 const int &r2 = i * 42;//正确,常量左值引用可以绑定右值 10 int &&rr2 = i * 42;//正确,右值引用绑定到右值上 11 12 // 右值引用类型变量本身是左值的,但其算术/关系表达式是右值的 13 // int &&cnt1 = rr2;//错误,rr2变量是左值(虽然它本身是一个右值引用) 14 int &&cnt2 = rr2 * 1;//正确,rr2*1 是一个右值表达式 15 16 int &&cnt3 = 42;//字面常量是右值 17 18 //转换表达式会生成一个临时变量,即转换表达式的返回值是右值 19 int &&cnt4 = float(i); 20 21 //右值引用可以赋值右值引用 22 cnt4 = cnt3; 23 cout << cnt4 << endl;//42 24 25 return 0; 26 }