一句话,lambda返回类型自动推导走的是auto,而不是decltype,注意。

  1. class ObjectA
  2. {
  3. public:
  4. ObjectA()
  5. {
  6. val_ = ++g;
  7. }
  8.  
  9. ObjectA(const ObjectA& other)
  10. {
  11. val_ = ++g;
  12. }
  13.  
  14. ~ObjectA()
  15. {
  16. val_ = ;
  17. }
  18.  
  19. ObjectA& operator=(const ObjectA& other)
  20. {
  21. if (this != &other)
  22. {
  23. val_ = ++g;
  24. }
  25. return *this;
  26. }
  27.  
  28. int val_;
  29. };
  30.  
  31. const ObjectA& funcPlaceholder()
  32. {
  33. return ObjectA();
  34. }
  35.  
  36. class Test
  37. {
  38. public:
  39. ObjectA& returnValue()
  40. {
  41. return val_;
  42. }
  43.  
  44. const ObjectA& returnConstValue() const
  45. {
  46. return val_;
  47. }
  48.  
  49. ObjectA val_;
  50. };
  51.  
  52. void useRetValRef(std::function<ObjectA&()> func)
  53. {
  54. ObjectA& v = func();
  55. }
  56.  
  57. void useRetValConstRef(std::function<const ObjectA&()> func)
  58. {
  59. const ObjectA& v = func();
  60. const ObjectA& v2 = funcPlaceholder();
  61. }
  62.  
  63. int main(int argc, wchar_t* argv[])
  64. {
  65. Test tt;
  66. // 下面的lambda使用了自动返回类型推导->ObjectA,而不是ObjectA&,所以编译器报错,函数类型不匹配
  67. // f的类型是ObjectA(),而使用f的要求是ObjectA&()
  68. // auto f = [&tt](){return tt.returnValue();};
  69. // useRetValRef(f);
  70. // 下面这个情况也类似,j是ObjectA类型而不是ObjectA&
  71. auto j = tt.returnValue();
  72. j.val_ = ;
  73. // 这样i就是ObjectA&了,decltype是编译时推导,不会产生任何运行时代码
  74. decltype(tt.returnValue()) i = tt.returnValue();
  75. i.val_ = ;
  76.  
  77. tt.val_.val_ = ;
  78.  
  79. // 下面会引起warning C4172: returning address of local variable or temporary,
  80. // 因为lambda使用了自动返回类型推导->ObjectA,函数返回值,而不是引用
  81. // 而使用f2的地方用const&接收了这个值,所以模版展开后出现类似这样的代码
  82. /*
  83. const ObjectA& func()
  84. {
  85. return ObjectA();
  86. }
  87. */
  88. auto f2 = [&tt]()
  89. {
  90. return tt.returnConstValue();
  91. };
  92. useRetValConstRef(f2);
  93.  
  94. return ;
  95. }

c++ lambda返回类型自动推导的一些需要注意的地方的更多相关文章

  1. C++ 11 学习1:类型自动推导 auto和decltype

    Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译 ...

  2. C++ auto 完成类型自动推导与使用

    c++11 允许声明一个变量或对象(object)而不需要指明其类型,只需说明它是auto. 1.如: auto i = 42: //i是整型 double   f(); auto d=f(); // ...

  3. EF调用sp,EF自动生成返回类型

    在sp中添加下面的红色部分,就是执行sp时的返回类型,后面在EF中添加该sp后,EF会在DBContext文件中,自动生成调用该sp的代码,包括返回类型等,如下: public virtual Obj ...

  4. C++11的auto自动推导类型

    auto是C++11的类型推导关键字,很强大 例程看一下它的用法 #include<vector> #include<algorithm> #include<functi ...

  5. C++11 自动推导auto

    C++11 自动推导auto C++11中引入的auto主要有两种用途:自动类型推导和返回值占位. auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除.前后两个标准 ...

  6. lamda表达式和尾置返回类型

    基本lambda语法 基本形式如下: [capture](parameters) mutable ->return-type {body} [capture]:叫做捕获说明符,表示一个lambd ...

  7. C++ 函数模板的返回类型如何确定?

    函数模板 #include <iostream> // 多个参数的函数木板 template<typename T1, typename T2> T2 max(T1 a, T2 ...

  8. C/C++函数调用的几种方式及函数名修饰规则以及c++为什么不允许重载仅返回类型不同的函数

    我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域.这句话的意思是栈顶的地址和栈的最大容量是系统预 ...

  9. Scalaz(27)- Inference & Unapply :类型的推导和匹配

    经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏重学术型了. 本来不想花什么功夫在scala ...

随机推荐

  1. 如何理解systemstate

    什么是systemstate一个systemstate是由在实例中调用生成systemstats时由每一个进程的进程状态组成.而每一个进程状态是由每一个进程所持有的当前对象所对应的详细对象状态信息组成 ...

  2. NSArray 常用的一些方法

    - (NSUInteger) count; 返回数组中元素个数 - (id)objectAtIndex:(NSUInteger)index; 返回一个id类型的数组指定位置元素 - (id)lastO ...

  3. 访问 HTML中元素的方法

    http://www.w3school.com.cn/jsref/index.asp   1.document.getElementbyId("id1"),Html中,名称是id1 ...

  4. Struts2的运行原理和运行与原理

    Struts2 struts2的流程图 运行机制 1.客户端发送请求.通过ActionContextLoader调用FilterDispatcher(struts) 2.FilterDispatche ...

  5. 图像储存容器Mat[OpenCV 笔记11]

    IplImage 与 Mat IplImage是OpenCV1中的图像存储结构体,基于C接口创建.在退出之前必须release,否则就会造成内存泄露.在一些只能使用C语言的嵌入式系统中,不得不使用. ...

  6. 第14章高级IO总结

    1 低速系统调用 可能使进程永远阻塞的一类系统调用,包括: 1)读某些文件类型(管道.终端.网络设备)的数据 2)写某些文件类型(管道.终端.网络设备),但数据不能被立即接受(管道中无空间.流量控制等 ...

  7. shell sort

    sort is awesome! 22 hpp_national:talk:recentAtUsers-64490 23 hpp_national:talk:site_online_users:178 ...

  8. getDrawingRect,getHitRect,getLocalVisibleRect,getGlobalVisibleRect

    本文主要大体讲下getHitRect().getDrawingRect().getLocalVisibleRect().getGlobalVisibleRect. getLocationOnScree ...

  9. shell中的双引号,单引号,反引号

    在shell中引号分为三种:单引号,双引号和反引号. 单引号 ‘ 由单引号括起来的字符都作为普通字符出现.特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释.单引号用于保持引号内所有字 ...

  10. SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events

    由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...