std::forward理解

首先说明就是std::forward主要是用来解决在参数传递的过程当中,右值被传递为左值,失去了原来的无拷贝功能。
首先看下面例子:


void myp(int &t) {
    std::cout << "lvalue" << std::endl;
}
void myp(int &&t) {
    std::cout << "rvalue" << std::endl;
}
//这里说明一下,在模板函数中&&代表的是万能引用,不是大家想的右值引用
template <typename T>
void test(T &&t) {//既能作为左值引用,又能作为右值引用
    myp(t);
    myp(std::forward<T >(t));
    myp(std::forward<T &>(t));//转发为左值
    myp(std::forward<T &&>(t));//转发为右值
}


int main() {
  test(1);//lvalue  rvalue  lvalue rvalue
  }

这里我们来解释一下:
当调用test(1)的时候,结果是:lvalue rvalue lvalue rvalue
可能觉得奇怪我输入的明明是右值,为什么第一个重载却调用的是左值引用,其实这也是我们为什么要发明完美转发的意义所在,防止右值引用在传递的过程中被转换为左值引用。

再来看下一个:

int main() {
   A a;
  test(a);//lvalue  lvalue  lvalue lvalue
  }

为什么转发为右值的时候还是左值呢,这是因为转发可以向下转而不能向上转。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值