左值:具有地址,存储在内存中

可以出现在赋值号=的左侧

可以取地址&

变量,对象,数组元素都是左值

右值:通常没有地址,存储在寄存器或临时内存中(如果是亡值(左值使用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",如果字符串特别长,拷贝会浪费很多资源

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐