C++ 完美转发为什么一定要用forward

刚看到这时,有一个疑问,好像 T && universal reference 已经可以接受所有类型的参数,并且保持原来参数的类型。为什么还要有forward呢。想明白后发现 T && 转发并不完美,在转发右值的时候会出问题, 有如下例子

void foo(int&& foo_arg)
{
}
template<typename T>
void fwd(T&& fwd_arg)
{
    foo(fwd_arg);//编译错误,需要forward<T>(fwd_arg)
}

int main(){
  fwd(30);
}

当传入字面常量30,模版参数T推导成 int ,模版实例化结果如下

void fwd(int&& fwd_arg) {  
            foo(fwd_arg);
  } 

虽然fwd_arg是的类型是右值引用,但fwd_arg本身是左值,当继续给foo传值的时候其实是一个int && 类型的左值。 就会产生编译错误

这个时候就要用,forward了,因为fwd_arg本身是左值,foo的参数是个右值引用,无法绑定到一个左值上。
用forward<T>(fwd_arg)当实参,T推断成int&&,所以返回值是int&& &&,折叠成int&&,可以被绑定到foo参数的右值引用上,就没有错误了

所以,universal reference 转发时并不完美,只完美了一半,当转发目标的的参数是右值引用时,会出现问题。
std::forward 解决当转发目标的的参数是右值引用时的问题。可以保持原始参数的类型,将实参从原来的类型为右值引用的左值,变成了本身就是右值引用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 还原班级授课模式提高线上教学效率 一场疫情,让这个寒假扩容超两个月了。为了落实“停课不停学”,线上教学如期开始。为...
    做个会思考的老师阅读 164评论 0 0
  • 今天呢其实感触特别多想的也多,今天算是把作息调到了舒服的时间,一定不要晚上做决定因为晚上呢人的意志力薄弱所以会做...
    莫忘小寒阅读 104评论 0 0
  • 夜深深 夜深人寂静,辗转难入眠, 披衣长坐起,思绪缕万千。 桩桩件件像谁言? 人间是寡欢,清苦以尝尽, 何时甜来,...
    听予你说阅读 157评论 0 1
  • 5S故事呈现复盘 5s故事化呈现复盘 一定要让听众对你“一见钟情”! 开始的自我介绍在整场讲座中起着非常重要的作...
    額爾古納靜招募合伙人阅读 292评论 0 0
  • 开心佛日志之(一五三二) 善待孩子自信心! 每个孩子都是独一无二的,都有满满的自信心,我们要善...
    开心佛阅读 203评论 0 3