c++左值与右值(自写)
左值:具有地址,存储在内存中
可以出现在赋值号=的左侧
可以取地址&
变量,对象,数组元素都是左值
右值:通常没有地址,存储在寄存器或临时内存中(如果是亡值(左值使用std::move变为右值),可能有地址)
不能出现在赋值号=的左侧
不能取地址&
字面量,表达式计算结果都是右值
变量就是地址的别名
引用是变量的别名,引用是通过指针来实现的
左值引用:
int a=10;
int& b=a;
右值引用:
const int &&b=20;,
右值引用,b是对右值20的引用,实际上这个b在内部也是一个指针,相当于一个指针指向了这个20,只不过这个20没有”家“,没有地址
所以先要把20搬到一个临时住所,放到栈里面
再让指针指向这个临时住所,右值引用就是右值的临时变量
move移动语义,move的作用就是将左值转换为右值
const int &&c=std::move(a);
目的是:让这个c在传递参数或者赋值的时候,触发移动构造,避免深拷贝
比如说这个
string str1="Hello";
string str2=str1;//不加move,触发移动构造,深拷贝,两个都是"Hello",如果字符串特别长,拷贝会浪费很多资源