forward

std::forward在参数传递的过程中,我们总希望将参数的类型原原本本地传递下去,但现实确实很"残酷"的,往往将一个右值引用参数作为函数的形参,在函数内部再转发该参数的时候它已经变成一个左值,并不是他原来的类型。  

因此,需要一种方法能够按照参数原来的类型转发到另一个函数,这种转发类型称为完美转发(Perfect Forwarding)。即是说完全依照模板的参数的类型(即保持参数的左值、右值特征)。

 

void func(int i){}; //#1

void func(int &&i){}; //#2
template<class T>

void funcWrap(T && param)

{

  func(param); //#5

}
int main()

{ int x = 10;

funcWrap(x); //#3

funcWrap(10); //#4

func(10); //#6

}

 

 

1.这里#3和#4最终输出都会调用到#1,为什么?
因为在参数传递的过程中,都会退变为左值,所以在#5就只会调用到#1处。


2.#6的执行会不会有问题?

会,因为参数10是一个右值,经过重载决议后选不出最优的,所以这里就会报错。

 

这里参数传递的过程中,都会退变为左值,很明显不符合期望,稍加改造:

func(std::forward<T>(param));    //#5

 

 

思考:问什么这里的funcWrap要使用通用引用?

因为,要使用完美转发,势必是因为左值和右值都存在的情况,只有通用引用既能接受左值也能接收右值。完美转发与通用引用也是一对好拍档

如果一个变量或者参数被声明为T&&,其中T是被推导的类型,那这个变量或者参数就是一个universal reference。

 

 

 

相关推荐

  1. forward

    2023-12-20 06:10:03       44 阅读
  2. adb forward使用

    2023-12-20 06:10:03       44 阅读
  3. Pytorch register_forward_hook()

    2023-12-20 06:10:03       16 阅读
  4. C++:move&forward

    2023-12-20 06:10:03       12 阅读
  5. Linux bridge forwarding table

    2023-12-20 06:10:03       12 阅读
  6. net.ipv4.ip_forward

    2023-12-20 06:10:03       34 阅读
  7. C++ 设计模式 Forward Declaration & Pimpl

    2023-12-20 06:10:03       33 阅读
  8. http header 请求头 x-forwarded-for

    2023-12-20 06:10:03       38 阅读
  9. STL标准库(三)之forward_list

    2023-12-20 06:10:03       29 阅读
  10. 容器库(4)-std::forward_list

    2023-12-20 06:10:03       27 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-20 06:10:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-20 06:10:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-20 06:10:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-20 06:10:03       20 阅读

热门阅读

  1. C++入门【11-C++ 数字】

    2023-12-20 06:10:03       33 阅读
  2. k8s 定义 gRPC 存活探针

    2023-12-20 06:10:03       37 阅读
  3. Windows | 快速解决环境变量Path被误删 拯救方法

    2023-12-20 06:10:03       35 阅读
  4. 是的,决定放弃算法去机器学习了

    2023-12-20 06:10:03       40 阅读
  5. Unity工具栏介绍

    2023-12-20 06:10:03       35 阅读
  6. 深度比较(lodash 的 isEqual 方法)

    2023-12-20 06:10:03       40 阅读
  7. 通过fu过 Function Calling 查询数据库

    2023-12-20 06:10:03       34 阅读
  8. 普冉(PUYA)单片机开发笔记 [完结篇]:使用体会

    2023-12-20 06:10:03       48 阅读
  9. 高空作业MR混合现实情景实训教学应用

    2023-12-20 06:10:03       41 阅读
  10. 【算法小题 go程序版】递归练习 -- 猴子吃桃问题

    2023-12-20 06:10:03       39 阅读