std::forward 完美转发的原理

C++11中的std::forward用于实现参数的完美转发,配合模板和右值引用,确保原始参数类型不变。通过引用折叠规则,当模板参数为T&&时,可以实现左值和右值的正确转发。完美转发的关键在于正确地传递参数类型,以调用匹配的DoItActually()函数。

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

C++11里面有两个函数比较有意思,一个是std::move 另一个就是std::forward.

move函数是用来实现右值引用的。而forward是用来转发参数的。

假设有这样一个模板转发函数:

template<typename T>
void DoSomething(/* */){
    DoItActually(/* */);
}

DoItActually(int & a){}//lvalue ver
DoItActually(int&& a){}//rvalue ver

能够自动识别参数,调用合适的DoItActually()函数,那要怎么实现呢?

需要知道,对于模板参数T,如果实参是T类型的左值,则模板参数被推导为T&类型;实参是T类型的右值,则模板参数被推导为T&&类型。
C++11 提出了新的模板匹配规则,即引用折叠规则:
T& & –> T&.

T&& & –> T&.

T& && –>T&.

T&& && –> T&&.
第一列是模板推导的类型,左值T&a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值