1 1.左值引用(T&), 只能绑定左值 2 2.右值引用(T&&)只能绑右值 3 生命周期只有一行(有名字之后,编译器认为是左值) 4 3.常量左值 左值右值都能绑定 5 4.已命名的右值引用(左值) 6 7 test code: 8 9 class A 10 { 11 public: 12 A(); 13 ~A(); 14 A(const A&); 15 A(A&&); 16 A operator=(const A& a); 17 A operator=(const A&& a); 18 int val{23}; 19 }; 20 21 int main() 22 { 23 A a; 24 cout << "call:" << endl; 25 A& tmp = a; 26 func_val(tmp); 27 //右值-> 对象 28 func_val(std::move(a)); 29 cout << "-------------" << endl; 30 //直接传引用 31 func_refer(tmp); 32 //右值引用 -> 常引用 33 func_refer(std::move(tmp)); 34 cout << "-------------" << endl; 35 // 右值 36 func_rval(std::move(tmp)); 37 A&& atmp = std::move(tmp); 38 //func_rval(atmp); 39 cout << "-------------" << endl; 40 41 A aa = tmp;//拷贝构造函数 42 //aa = tmp; 43 A&& arval = std::move(tmp); 44 A ad = std::move(tmp); 45 A ad1 = arval; 46 //赋值函数 47 ad = arval; 48 //移动赋值函数 49 ad = std::move(tmp); 50 A ta; 51 A tt = std::move(ta); 52 std::string m = "abc"; 53 std::string && ma = std::move(m); 54 std::string mm = ma; 55 56 return 0; 57 }