引用折叠原则和完美转发是有联系的,可以说后者是基于前者的某些特性实现的,具体来看一下。
要理解完美转发,需要了解两个知识点:
1. 引用折叠原则(Reference collapsing rules)。
2. 右值函数模版参数类型推导(Template argument deduction)
先看引用折叠。
所谓引用折叠或者崩塌(collapse)既为当引用指向引用的时候,这里的引用可以是左值也可以是右值引用,最终的类型会有部分被折叠到一起。具体规则如下(注意地址符之间的空格):
折叠前 | 折叠后 | 注释 |
---|---|---|
A& & | A& | 指向左值引用的左值引用折叠/崩塌为左值引用 |
A& && | A& | 指向左值引用的右值引用折叠/崩塌为左值引用 |
A&& & | A& | 指向右值引用的左值引用折叠/崩塌为左值引用 |
A&& && | A&& | 指向右值引用的右值引用折叠/崩塌为右值引用 |
以上原则可以概括为:凡是右左值引用参与的情况下,最终的类型都会变为左值引用,只有全部为右值引用的情况下才会变为右值引用。