首先区分什么是左值和右值。
左值:占内存空间,能对其取址(&)。
右值:非左值。
1.引用
引用是对一个变量起别名(不能对右值取引用)
int a = 10,&b = a,c=b;
cout<<&a<<' '<<&b<<' '<<&c<<endl;
cout<<a<<' '<<b<<' '<<c<<endl;
00AFFAE0 00AFFAE0 00AFFAC8
10 10 10
2.右值引用
右值引用是对右值进行引用(不能对左值取引用);
感觉是脱裤子放屁。(目前无法理解)
不过对右值引用需要申请额外的内存空间存放右值。
3.move()
加上move才知道右值引用的用处。
move()对形参右值化(左值和右值都被当成右值)。
如果左边是右值引用,左值的右值引用不仅会赋右值,还会引用原来左值。
int a = 10,&&b =move(a),&&c=move(10);
cout<<&a<<' '<<&b<<' '<<&c<<endl;
cout<<a<<' '<<b<<' '<<c<<endl;
004FFE1C 004FFE1C 004FFD38
10 10 10
总结:
引用不能对右值;
例如: 不能int &a=b;
右值引用不能能对左值;
例如:不能int &&a=10;
右值引用+move=啥都能引用;
int a=10;
int &&b=move(a),&&c=move(10);
以上目前理解。