谈一谈std::forward

本文详细介绍了C++中的std::forward函数,包括引用折叠、完美转发的概念,并与std::move进行了比较。同时,通过STL中的实例展示了std::forward的具体应用。

上篇文章我们讲了移动语义相关知识

本篇文章我们介绍下std::forward,我们会讲到引用折叠,完美转发,及std::forward与std::move进行比较

1 引用折叠

我们都知道通常情况下不能将一个右值引用绑定到左值上,即:

int i = 0;
int &&ii = i;  // error

当然也有例外的情况,左值传递给右值引用参数,且右值引用指向模板类型参数(T&&)

template<typename T>
void foo(T&& u) {
    std::cout << u;
}

int main() {
    int i = 0;
    foo(i);
    return 0;
}

这时编译器推断类型是为实参的左值引用类型(int&), 那么foo的类型就是int & &&,在这时就会发生引用折叠。折叠的规则为,以X类型为例:

  • X& &,X& &&和X&& &都折叠成X&
  • X&& &&折叠成X&&

2 完美转发

某些函数需要将其一个甚至多个参数连同类型不变的转发给其他函数。
即通过函数转发保证参数的左值/右值,const/non-const属性不变。
封装一个通用的f函数转发给g,我们看下如果来写f函数

template<typename T>
void f(/*这里应该如何写*/ t) {
  g(t);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值