引用
左值 | 右值 (纯右值,将亡值) |
可以在等号左边 |
只能在等号右边 |
能够取到地址 | 不能取地址 |
具名 | 不具名 |
1. 变量名 2.返回左值引用的函数 3.解引用 (*this) 4. ++i是左值 5. 声明出来的左值引用 6.右值引用 |
1.返回非引用类型的函数调用 (int func(void)) 2.i++ 是纯右值 3. 算术,逻辑,比较表达式 4.将亡值:触发移动构造 或者 移动赋值构造,并资源转移,接着该值会调用析构函数 |
左值引用可以指向右值。 const int & , 不能修改这个值。
右值引用 int && 为了解决能够修改这个值。
将左值改成右值。 std::move(v)
类对象有堆栈资源, 需要进行深拷贝。
A a ,b
a=b // 移动构造
---------
A a;
A b(a); //拷贝构造
A c(std::move(a)); // 右值构造 对象赋值,避免对象的重新分配。 减少一次深拷贝,在创建对象的时候,直接将原先的数据地址进行转移。
移动构造,就是来解决,深拷贝的。
避免对象拷贝
左值引用 | 右值引用 |
函数传参数 函数返回值 |
实现移动语义 实现完美转发 (在模板函数中,不改变原有的左右值属性,可以将自己的参数,完美的转给内部调用的其他函数) |
借用万能引用func(T &&t){ //引用折叠,完美转发 |
https://www.bilibili.com/video/BV14z4y1B7bd?p=2&vd_source=070088cf37075da9bc162f2560ec50eb