本文共 1510 字,大约阅读时间需要 5 分钟。
结果
能够看到,未被捕获的变量不能在lambda里面使用. 再来看看通过值捕捉 #include <iostream> using namespace std; int main(){ int n=6; int k=99; cout<<"In first n="<<n<<" k="<<k<<endl; [=](){n=n*2,k=k+1;}(); cout<<"now n="<<n<<" k="<<k<<endl; } 结果: 先来看看上一节中关于mutable的介绍:mutable:(可选):假设所在作用域的变量是通过值捕捉的,那么lambda表达式的主体中就不能改动这些副本的值.这些副本默认标记为const,因此lambda表达式主体不能改动这些副本的值.假设lambda表达式标记为mutable,那么这些副本则不是const,因此主体能够改动这些本地副本.(类似于參数传递中的值传递以及引用传递改动源值)因此,假设想在lambda中改动捕获的值,应声明为mutable #include <iostream> using namespace std; int main(){ int n=6; int k=99; cout<<"In first n="<<n<<" k="<<k<<endl; [=]()mutable{n=n*2,k=k+1;}(); cout<<"now n="<<n<<" k="<<k<<endl; } 结果: 为什么改动了之后,m和k的值都不变呢?原因是事实上通过值捕获的都是副本来的,细致看mutable就能够看到了. 那么通过引用捕捉呢? #include <iostream> using namespace std; int main(){ int n=6; int k=99; cout<<"In first n="<<n<<" k="<<k<<endl; [&]()mutable{n=n*2,k=k+1;}(); cout<<"now n="<<n<<" k="<<k<<endl;
}
能够看到,仅仅有通过引用捕获,才干改动外部变量的值!
关于lambda捕捉块的介绍就到这里了.
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5200680.html,如需转载请自行联系原作者