在对象拷贝后就立即被销毁的情况下,移动而非拷贝对象会大幅度提升性能。以及像 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 }
View Code

相关文章: