118 C++ 引用折叠(引用坍塌),转发,完美转发,forward

本文围绕C++展开,介绍引用折叠规则,它是编译器内部处理左值、右值引用的方式。还阐述了转发和完美转发,指出函数模版中参数转发存在的问题,通过万能引用初步解决,最终引入std::forward实现完美转发,同时对比了std::forward和std::move的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,引用折叠 规则

发生在  函数模版时候 编译器内部会处理。

在使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值