Effective Modern C++ 之 引用折叠

本文深入探讨了C++中万能引用的概念,解释了如何根据实参的值类别(左值或右值)推导出不同的引用类型,并通过实例说明了引用折叠的四种情况。此外,还详细解析了std::forward()的实现原理及其在完美转发中的应用。
摘要由CSDN通过智能技术生成

前面我们介绍到,当函数模板的形参的型别为万能引用时,当传递给该函数模板的实参是个左值时,则推导出的形参的类型型别为左值引用,当传递给该函数模板的实参是个右值时,则推导出的形参的类型型别为右值引用。还有在实现完美转发时,当传递给调用者的实参是左值时,使用std::forward()被调者的形参的型别为左值引用,当传递给调用者的实参是右值时,使用std::forward()被调者的形参的型别为右值引用。我们先看一个简单的例子:

template<typename T>
void _fun(T&& t) {};

当我们为_fun()传递实参时,函数模板T的推导结果型别中,会把传给传递给该函数是左值还是右值的信息编码到T里面去。因此,当我们传递的实参是个左值,T的型别被推导为T&,当我们传递的实参是个右值,T的型别被推导为T。但是为什么传递的实参是左值时,t的类型型别为左值引用呢?答案:发生了引用折叠。

因为存在右值引用和左值引用,使用引用折叠分四种情况:右值——右值-->右值引用    左值——左值-->左值引用   右值引用——左值引用-->左值引用  左值引用——右值引用-->左值引用  。也就是说任意引用为左值引用,则结果为左值引用,否则结果为右值引用。

std::forward()的实质是应用了引用折叠和强制类型转换。

template<typename T>
T&& forward(std::remove_reference_t<T>& t) {
	return static_cast<T&&>(t);
}

以上是std::forward()的简单实现。我们可以发现不管传递的是左值还是右值,都会进行引用折叠。但是只有传递的是右值时才进行强制类型转换。

引用折叠出现的语境有四种:第一,模板的类型推导。  第二,auto的类型推导(实质就是模板的类型推导)。第三,typedef和别名声明(using)。第四,decltype的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值