一,引用折叠 规则
发生在 函数模版时候 编译器内部会处理。
在使用auto 的情况下,也会遇到。(本节课不会讲解这个)
注意:引用折叠是一种规则,是编译器内部在遇到 左值引用 和 右值引用时的一种处理方式。实际上是 编译器内部在 遇到函数模版时候的一种处理方案,我们只需要知道这种方案即可。
先看例子
//如上的改动,让我们有一个疑问,就是 int& && tmprv 是怎么和 int & tmprv 等价的呢?
//这里就要涉及到 引用折叠 的概念。
//引用折叠是编译器内部的操作,对于我们来说是透明的,我们只需要理解这个规则就OK
//引用折叠有如下的几种组合
// & &
// & &&
// && &
// && &&
//引用折叠的规则:如果任意一个引用为 左值引用,那么结果就为左值应用,否则就是右值引用
#include <boost/type_index.hpp>
template<class T>
void myfunc27(T&& tmprv) { //万能引用
using boost::typeindex::type_id_with_cvr;
cout << "T 类型 = " << type_id_with_cvr<T>().pretty_name() << endl; //显示T类型
cout << "tmprv 类型 = " << type_id_with_cvr<decltype(tmprv)>().pretty_name() << endl; //显示T类型
}
void main() {
//引用折叠也叫做引用坍塌,要结合一部分上一节课的内容,我们先来复习一下,模版参数是万能引用时的一些
myfunc27(199);//T 的类型 = int tmprv 类型 = int &&
int i = 18;//i的类型是int型, i 本身是个左值。
myfu