什么是左值,右值???
一句话核心判断口诀:能取地址、有持久身份的是左值;不能取地址、临时、马上就要销毁的是右值。
左值引用,右值引用规则??
左值引用
右值引用
在string中理解左值引用右值引用的优势
移动构造函数是构造函数的一种,移动赋值运算符是赋值运算符的重载。
移动构造函数的第一个参数是该类类型的非 const 右值引用,而拷贝构造函数的第一个参数是该类类型的const 左值引用
。这是移动构造与拷贝构造最直观、最核心的区别。
看一下如何调用的
右值引用和移动语义在传参中的提效
引用折叠
| 模板参数推导类型 | 折叠结果 |
|---|---|
T& + &→T& | 左值引用 + 左值引用 = 左值引用 |
T& + &&→T& | 左值引用 + 右值引用 = 左值引用 |
T&& + &→T& | 右值引用 + 左值引用 = 左值引用 |
T&& + &&→T&& | 右值引用 + 右值引用 = 右值引用 |
在模板的使用上更多
完美转发
完美转发:在模板函数里面,把传入参数的「值类别(左值 / 右值)原封不动地传递给下一个函数,不改变它是左值还是右值。它的搭档就是:万能引用T&&
注意区分:
- 普通右值引用:
Type&&,只能接收右值- 万能引用:
T&&(T 是模板参数),能自动推导成左值引用 / 右值引用,遵循引用折叠规则
为了解决这个问题就有了完美转发
保持传入参数原本的属性