λ表达式和右值引用是c++ 11的两个非常有用的特性。
λ表达式实际上会由编译器创建一个<代码>,std::> 代码函数对象,以值的方式捕获的变量则会由编译器复制一份,在,std::函数对象中创建一个对应的类型相同的const成员变量,如下面的这段代码:
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++λ捕获模式与右值引用的使用