完美转发

文章目录

  • 完美转发
    • 引用折叠

引用折叠

也就是在c++11里面是没有引用的引用的T& &r=x这时候会发生引用折叠

也就是一般发生在

  • 模板实例化
  • auto decltype typedef的语境中

引用折叠的规则

  • 所有的右值引用折叠到右值引用上还是一个右值引用
  • 所有的其他引用的折叠都会变成左值引用,也就是说,左值引用具有传染性,粘上一个左值引用那就是左值引用了

所以有个概念叫做万能引用

(1)当万能引用(T&& param)绑定到左值时,由于万能引用也是一个引用,而左值只能绑定到左值引用。因此,T会被推导为T&类型。从而param的类型为T& &&,引用折叠后的类型为T&。

​ (2)当万能引用(T&& param)绑定到右值时,同理,右值只能绑定到右值引用上,故T会被推导为T类型。从而param的类型就是T&&(右值引用)。

  1. 当传递给func函数的实参类型为左值Widget时,T被推导为Widget&类别。然后forward会实例化为std::forward<Widget&>,并返回Widget&(左值引用,根据定义是个左值!
  1. 当传递给func函数的实参类型右值Widget时,T被推导为Widget。然后forward被实例化为std::forward<Widget>,并返回Widget&&(注意,匿名的右值引用是个右值!)
  1. 可见,std::forward会根据传递给func函数实参(注意,不是形参)的左/右值类型进行转发当传给func函数左值实参时,forward返回左值引用,并将该左值转发给process。而当传入func的实参为右值时,forward返回右值引用,并将该右值转发给process函数。

主要跟传参有关

string a("acb");
string&& b = std::move(a);
string c(b);  // 这里其实调用的是拷贝构造
string d(std::forward<string>(b));  // 这里调用的才是移动构造

右值引用是独立于值的,一个右值引用作为函数的形参,在函数的内部转发该参数的时候就已经变成一个左值并不是原来的类型

因为不论 左值引用 还是 右值引用 的变量(或参数)在初始化后,都是左值(参考 [sec|值类别 vs 变量类型]):命名的右值引用(named rvalue reference)变量 是 左值,但变量类型 却是 右值引用
在作用域内,左值变量 可以通过 变量名(variable name)被取地址、被赋值
所以,返回右值引用变量时,需要使用 std::move()/std::forward() 显式的 [sec|移动转发] 移动转发 或 [sec|完美转发] 完美转发,将变量 “还原” 为右值(右值引用类型)。

**面试答题的两个关键点: **

  • 右值引用其实是一个右值,只是能够绑定到左值,所以调用的时候就会调用构造函数
  • 完美转发里面含有一个有引用折叠,会根据你的实参类型进行相应的转换,右值还是右值,左值还是左值

c++11新特性之完美转发(std::foward)相关推荐

  1. C++11新特性以及std::thread多线程编程

    一 .C++11新特性 1. auto 类型推导 1.1 当=号右边的表达式是一个引用类型时,auto会把引用抛弃,直接推导出原始类型: 1.2 当=号右边的表达式带有const属性时,auto不会使 ...

  2. C++11 新特性之std::thread

    C++11 新特性之std::thread 原文:https://blog.csdn.net/oyoung_2012/article/details/78958274 从C++11开始,C++标准库已 ...

  3. 详谈C++11新特性之future及开源项目ananas(folly,std c++11和ananas的future各自的区别是?)

    一.前言 1.最早我是从微信公众号看到这篇文章的,了解到开源项目ananas(A C++11/golang protobuf RPC framework)实现了Linux高性能网络库和rpc功能,里面 ...

  4. 《深入理解C++11:C++ 11新特性解析与应用》——导读

    前 言 为什么要写这本书 相比其他语言的频繁更新,C++语言标准已经有十多年没有真正更新过了.而上一次标准制定,正是面向对象概念开始盛行的时候.较之基于过程的编程语言,基于面向对象.泛型编程等概念的C ...

  5. C++ C++11新特性--右值引用

    左值与右值 在C语言中,左值和右值一般有两种区分的方法.可以出现在赋值符号"="的两边的值为左值,只能出现在赋值符号"="的右边的值为右值:还有一种说法是能取地 ...

  6. [C++11] 新特性总结

    C++11新增加了哪些新特性?一般而言,大概有以下四个方面: "语法糖":nullptr, auto自动类型推导,范围for循环,初始化列表, lambda表达式等 右值引用和移动 ...

  7. c++11新特性的使用---可变模板参数、type_traits、function综合使用

    DLL帮助类 c++中手动调用dll是比较繁琐的,调用过程是:加载dll后还要定义一个对应的函数指针类型,接着调用GetProAddress获取函数地址,在转成函数指针,最后调用该函数如下例子: #i ...

  8. A Morden C++ —— C++11新特性指南

    A Morden C++ -- C++11新特性指南 by JOKER on 2013/10/14 不知不觉C++1x,也就是以前的C++0x已经基本达到工业使用的成熟度了,各个编译器的实现也很完整了 ...

  9. C++11新特性(原封不动转载待查)

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

最新文章

  1. java集合类学习笔记之LinkedHashMap
  2. 关于多边形内点数问题的一些变形
  3. ajax 传递数组与接收
  4. JVM性能调优中的命令总结
  5. 在JDK 9中将InputStream传输到OutputStream
  6. JavaFX中的塔防(4)
  7. LeetCode 900. RLE 迭代器(模拟/二分查找)
  8. 关于腾讯云丢数据事件的一些看法
  9. springMVC学习(7)-springMVC校验
  10. dj鲜生-16-这是危险的模块-isdangerous
  11. SSR -- 服务端渲染基础
  12. android自定义渐变色圆环,CircleShape渐变颜色圆环
  13. 10 个基于 JavaScript 的机器学习实例
  14. 经典软件架构设计模式
  15. python安装插件很慢_Sublime text3+python3配置及插件安装
  16. 【BZOJ】【P1406】【AHOI2007】【密码箱】【题解】【数论】
  17. 监听audio是否加载完毕
  18. macbookpro 序列号查询 香港苹果官网
  19. matlab用ifft,ifft(matlab中ifft是什么意思)
  20. Mybatis从入门到精通(全)

热门文章

  1. 什么是前端,前端的现状以及未来发展趋势,最简单的理解前端开发
  2. [luogu] P4981 父子 Cayley定理
  3. luogu插件:鼠标点击特效
  4. 136 基于单片机RFID智能一卡通扣费充值系统设计【毕设课设】
  5. c语言 fmod,我也发个程序 混脸熟。。FMOD做的音乐播放器。。
  6. 7-9 心理阴影面积 (20 分)
  7. 报错:CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate‘. 问题解决
  8. 2022年危险化学品生产单位安全生产管理人员考试试题及在线模拟考试
  9. 淘宝权重,权重影响因素,流量分配原则
  10. jsp中c标签的c:if和c:choose判断