1. /*
  2. * 右值引用 2: Perfect Forwarding
  3. */
  4. void foo( boVector arg );
  5. // boVector既有移动构造又有拷贝构造
  6. template< typename T >
  7. void relay(T arg ) {
  8. foo(arg);
  9. }
  10. int main() {
  11. boVector reusable = createBoVector();
  12. relay(reusable);
  13. ...
  14. relay(createBoVector());
  15. }
  16. // 什么才能叫完美传递,Perfect Forwarding
  17. /*
  18. * 1. 没有昂贵且不必要的拷贝构造
  19. * 2. 右值传递为右值,左值传递为左值
  20. */
  21. // 解决方法:
  22. template< typename T >
  23. void relay(T&& arg ) {
  24. foo( std::forward<T>( arg ) );
  25. }
  26. //* 注意:之所有有效是因为,类型T是模板类型
  27. /*
  28. * 引用折叠的规则 ( C++ 11 ):
  29. * 1. T& & ==> T&
  30. * 2. T& && ==> T&
  31. * 3. T&& & ==> T&
  32. * 4. T&& && ==> T&& //只有两个右值引用还是右值引用
  33. */
  34. template< classs T >
  35. struct remove_reference; // 移除类型T的引用
  36. // T为int&
  37. remove_refence<int&>::type i; // int i;
  38. // T为int
  39. remove_refence<int>::type i; // int i;
  40. template< typename T >
  41. void relay(T&& arg ) {
  42. ...
  43. }
  44. /*
  45. * 右值引用由type&&指定
  46. *
  47. * 那么type&&表示右值引用?
  48. */
  49. // T&&变量以右值 => 右值引用
  50. relay(9); => T = int&& => T&& = int&& && = int&&
  51. // T&&变量以左值初始化 => 左值引用
  52. relay(x); => T = int& => T&& = int& && = int&
  53. // T&&是一个通用引用: 左值,右值,const,non-const等
  54. // 前提条件:
  55. // 1. T是一个模板类型
  56. // 2. T发生了类型折叠
  57. // - T 是函数模板类型,不是类模板了类型
  58. template< typename T >
  59. void relay(T&& arg ) {
  60. foo( std::forward<T>( arg ) ); // 将arg转回T&&类型
  61. }
  62. // std::forward()的实现
  63. template<class T>
  64. T&& forward(typename remove_reference<T>::type& arg) {
  65. return static_cast<T&&>(arg);
  66. }
  67. // std::move()和std::forward()比较
  68. std::move<T>(arg); // 将arg变成一个右值类
  69. std::forward<T>(arg); // 将arg变成T&&类型
  70. /*
  71. * 总结:
  72. *
  73. * 右值引用两个主要使用地方:
  74. * 1. 移动语义
  75. * 2. 完美传递
  76. */

C++11--右值引用(Perfect Forwarding)的更多相关文章

  1. C++11右值引用

    [C++11右值引用] 1.什么是左值?什么是右值? 左值是表达式结束后依然存在的对象:右值是表达式结束时就不再存在的对象. 2.std::move的作用是什么? std::move用于把任意类型转化 ...

  2. 关于C++11右值引用和移动语义的探究

    关于C++11右值引用和移动语义的探究

  3. C++11 右值引用和转移语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...

  4. C++11 右值引用 与 转移语义

    新特性的目的 右值引用(R-value Reference)是C++新标准(C++11, 11代表2011年)中引入的新特性,它实现了转移语义(Move Semantics)和精确传递(Perfect ...

  5. C++ 11 右值引用

    C++11中引入的一个非常重要的概念就是右值引用.理解右值引用是学习“移动语义”(move semantics)的基础.而要理解右值引用,就必须先区分左值与右值. 注意:左值右值翻译可能有些问题 *L ...

  6. C++ 11 右值引用以及std::move

    转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46779063 新类型: int和int&是什么?都是类型.int是整数类型,in ...

  7. 【转】C++ 11 右值引用的理解

    右值引用的目的之一,是为了C++中一个比较影响性能的问题:拷贝临时对象,例如,在 int foo(){ ... } int x; x = foo(); 中,在第三句中,发生了以下的事情: 1.销毁 x ...

  8. C++11右值引用和std::move语句实例解析

    关键字:C++11,右值引用,rvalue,std::move,VS 2015 OS:Windows 10 右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一.从实践 ...

  9. c++11——右值引用

    1. 左值和右值 左值是表达式结束之后仍然存在的持久化对象,而右值是指表达式结束时就不再存在的临时对象.     c++11中,右值分为两种类型:将亡值(xvalue, expiring value) ...

随机推荐

  1. 百练6255-单词反转-2016正式B题

    百练 / 2016计算机学科夏令营上机考试 已经结束 题目 排名 状态 统计 提问   B:单词翻转 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个 ...

  2. ios开发常用封装的实用方法

    #pragma mark 获取设备id + (NSString *)getDeviceId { NSString *identifierForVendor = [[UIDevice currentDe ...

  3. HDU2029:Palindromes _easy version

    Problem Description "回文串"是一个正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.请写一个 ...

  4. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  5. 20165313 《Java程序设计》第九周学习总结

    教材学习总结 1.URL类 :ava.net包中的URL类是对统一资源定位符的抽象,使用URL创建对象的应用程序称作客户端程序,客户端程序的URL对象调用InputStream openStream( ...

  6. hdu2732 Leapin' Lizards 最大流+拆点

    Your platoon of wandering lizards has entered a strange room in the labyrinth you are exploring. As ...

  7. 通过阻止 touchstart 事件,解决移动端的 BUG

    在 iOS10 下,即使设置了 meta 标签的 user-scalable=no 依然不能阻止用户缩放. 解决此 BUG 的方法是阻止 PC 事件: document.addEventListene ...

  8. 【Jmeter】分布式并发测试

    一.前提: 1.最近在做一下压测,但是单台服务器的CPU,内存可能不够支撑压测的项目,这时候,我们可以使用Jmeter分布式压测. 2.本次使用的环境: 1台服务器做master(调度器) 5台服务器 ...

  9. nakadi 一款基于kafka 的http event broker

    nakadi 是zalando 开源的一款基于kafka 的event broker ,我们可以方便的使用http 协议进行操作 支持一些特性: stream 操作,我们可以流的方式订阅event e ...

  10. Percona XtraDB Cluster 的一些使用限制(PXC 5.7)

    Percona XtraDB Cluster有众多的优秀特性,使得mysql集群得以轻松实现.但是不要忽略了它的一些限制.如果你无法接受,或者你的应用程序或数据库(比如使用了memory引擎)对限制无 ...