c++λ捕获模式与右值引用的使用

  

λ表达式和右值引用是c++ 11的两个非常有用的特性。

  

λ表达式实际上会由编译器创建一个<代码>,std::>         int main () {   std:: string str=安馐浴?   printf("字符串地址% p在主,str % s \ n”,和str, str.c_str ());   汽车funca=(str) () {   printf("字符串地址% p(主要λ)str % s \ n”,和str, str.c_str ());   };      std:: function<无效()在funcb=funca;   std:: function<无效()在funcc;   funcc=funca;      printf (" funca \ n ");   funca ();      std:: function<无效()在funcd=std::移动(funca);   printf (" funca \ n ");   funca ();      printf (" funcb \ n ");   funcb ();      std:: function<无效()在funce;   funce=std::移动(funcb);      printf (" funcb \ n ");//funcb ();      printf (" funcc \ n ");   funcc ();      printf (" funcd \ n ");   funcd ();      printf (" funce \ n ");   funce ();//std:: function<无效(int)比;funcf=funce;      返回0;   }      

这段代码的输出如下:

  
  

Stringaddress0x7ffd9aaab720在主要开始于
  funca
  Stringaddress0x7ffd9aaab740(主要λ),开始于
  funca
  Stringaddress0x7ffd9aaab740(主要λ)str
  funcb
  Stringaddress0x55bdd2160280(主要λ),开始于
  funcb
  funcc
  Stringaddress0x55bdd21602b0(主要λ),开始于
  funcd
  Stringaddress0x55bdd21602e0(主要λ),开始于
  funce
  Stringaddress0x55bdd2160280(主要λ),开始于
  

     

由上面调用,funca时的输出,可以看到λ表达式以值的方式捕获的对象str,其地址在λ表达式内部和外部是不同的。

  

<代码> std::>         std:: function<无效()在funcb=funca;      

由调用,funcb时的输出,可以看到拷贝构造时是做了逐成员的拷贝构造。

  

<代码> std::>         std:: function<无效()在funcc;   funcc=funca;      

由调用,funcc时的输出,可以看到赋值时是做了逐成员的赋值。

  

<代码> std::>         std:: function<无效()在funcd=std::移动(funca);   之前      

由移动构造之后,调用,funca和,funcd时的输出,可以看到移动构造时是做了逐成员的移动构造。

  

<代码> std::>   

,

        std:: function<无效()在funce;   funce=std::移动(funcb);      printf (" funcb \ n ");//funcb ();      之前      

这里把移动赋值之后对,funcb的调用注释掉了,这是因为,作为源的,funcb在移动赋值之后被调用是,会抛出异常,如:

        主要字符串地址0 x562334c34280(λ),str测试   funcb   终止之后调用扔aninstanceof“std:: bad_function_call”   ():bad_function_call   之前      

同时,由调用,funce时的输出可以看的到,该输出与,funcb在移动赋值之前被调用时的输出完全相同只即移动赋值是将对象整体移走了,这与移动构造时的行为不太一样。

  

<代码> std::>         std:: function<无效(int)比;funcf=funce;   之前      

这行代码会造成编译失败,编译错误信息如下:

  
  

. ./src/降级。cpp:“intmain()函数”:
  . ./src/降级。cpp: 64:36:错误:转换从“std:: function<无效()在“种基本类型的std:: function<无效(int)在“要求
  ,,std:: function<无效(int)比;funcf=funce;
  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,^ ~ ~ ~ ~
  :* * * (src/降级。o]错误1
  src/子目录。可:18:配方为目标的src/降级。o '失败
  

     

在λ中以值的方式捕获的右值对象,只是在λ的std::函数对象中做了一份被捕获的右值对象的拷贝,而原来的右值则没有任何改变。

c++λ捕获模式与右值引用的使用