首先说明就是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}

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

std::forward理解相关推荐

  1. 理解std::move和std::forward

    std::move c++11中提供了std::move()来将左值转换为右值引用,从而方便的使用移动语义.move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝.     ...

  2. [C/C++]关于C++11中的std::move和std::forward

    http://blog.sina.com.cn/s/blog_53b7ddf00101p5t0.html std::move是一个用于提示优化的函数,过去的c++98中,由于无法将作为右值的临时变量从 ...

  3. 恶搞一下std::forward函数

    文章目录 前言 函数模板 forwawrd 函数定义 forwawrd 完美转发 完美转发失效 总结 前言 关于 std::forward 的用法在之前的文章 <C++11中std::move和 ...

  4. 完美转发std::forward、引用折叠与函数模板实际上是一场内存“权力的游戏”

    简介   学习C++的过程中,会遇到各种技术,一种技术的出现往往是在很多其它技术的铺垫下出现的.对于某项技术的学习,如果不连贯往往导致一知半解,似懂非懂.首先,需明确完美转发是干嘛的?其作用是函数模板 ...

  5. std:forward 完美转发

    概述:     // TEMPLATE CLASS identity template<class _Ty>     struct identity     {    // map _Ty ...

  6. 【C++ Primer | 16】std::move和std::forward、完美转发

    右值引用应该是C++11引入的一个非常重要的技术,因为它是移动语义(Move semantics)与完美转发(Perfect forwarding)的基石: 移动语义:将内存的所有权从一个对象转移到另 ...

  7. C++ std::move/std::forward/完美转发

    右值引用相关的几个函数:std::move, std::forward 和 成员的 emplace_back; 通过这些函数我们可以避免不必要的拷贝,提高程序性能. move 是将 对象的状态 或者 ...

  8. 《Effective Modern C++》学习笔记之条款二十五:针对右值引用实施std::move,针对万能引用实施std::forward

    我们知道,一个函数接受一个右值引用参数后将变成左值(可以对其取地址),所以如果在函数内部想要继续使用其右值属性,就可以对其实施std::move,将形参左值转换为右值. 而对于万能引用,因为其实参可能 ...

  9. C++11新特性之 std::forward(完美转发)

    上篇博客对右值.右值引用都做了简要介绍. 我们也要时刻清醒,有时候右值会转为左值,左值会转为右值. (也许"转换"二字用的不是很准确) 如果我们要避免这种转换呢? 我们需要一种方法 ...

最新文章

  1. Windows Server 2008常见的安全设置
  2. 【解决方案】vue不是内部或外部命令
  3. uniapp H5页面嵌入微信小程序 ios 下 video组件 播放视频 设置 border-radius overflow:hidden 不生效
  4. linux显示fio为非法指令,FORTRAN运行错误消息列表中英对照.doc
  5. MaxCompute规格详解 让您花更低的成本获得更高的业务价值
  6. linux命令行安装libxml,Ubuntu 14.04下libxml2的安装和使用
  7. Windows下配置Nginx+php7
  8. android 开发 - 结束所有activity
  9. 【模仿】调用微信聊天功能和分享功能
  10. 在python中类型属于对象变量是没有类型的_如何理解python对象有类型,变量无类型...
  11. 水仙花区间java_给你A和B,求[A,B]区间内有多少个水仙花数 输入描述: 两个整数,用空格隔开,保证数字...
  12. iPhone应用程序的启动过程
  13. javascript去除空格
  14. 史上最全后端技术介绍
  15. Mac读写ntfs磁盘工具:Paragon NTFS for Mac
  16. 微信小程序 实现提示弹窗
  17. 计算机表格常用根式,数学根号表格.doc
  18. 单页面优化有哪些可以参考的策略
  19. Vue报错:Invalid prop: type check failed for prop .... Expected String with value 1, got Number 1
  20. Automatic classification of defective photovoltaic module cells in electroluminescence images-论文阅读笔记

热门文章

  1. 图像处理QPixmap、Picture、QBitmap
  2. Python快速编程入门#学习笔记02# |第十章 :Python计算生态与常用库(附.小猴子接香蕉、双人乒乓球小游戏源码)
  3. 如何在未越狱的ios系统安装ipa文件
  4. houseoforange_hitcon_2016(unsortbin attack,fsop)
  5. XAMPP介绍、安装及使用
  6. 秒杀99.99%大学生!看看清华的学霸到底有多牛?
  7. python 变量前怎么加r
  8. Typora 插入图片设置
  9. java地理坐标转屏幕_(转)经纬度坐标转换为屏幕坐标
  10. tcp/ip详解卷一总结