c – 在lambda函数中捕获和传递参数之间的差异

前端之家收集整理的这篇文章主要介绍了c – 在lambda函数中捕获和传递参数之间的差异前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我理解lambda功能和它在c 11中的目的.但是我不明白“捕获值”和“传递参数”之间的区别.
例如..
  1. #include <iostream>
  2. #include <functional>
  3. using namespace std;
  4.  
  5. int add(int a,int b){
  6. return a+b;
  7. }
  8.  
  9. int main(int argc,char** argv){
  10.  
  11. function <int(int,int)> cppstyle;
  12. cppstyle = add;
  13.  
  14. auto l = [] (function <int(int,int)> f,int a,int b) {return f(a,b);};
  15.  
  16. cout << l(cppstyle,10,30) <<"\n";
  17. }

以上代码输出与下面的代码相同.

  1. #include <iostream>
  2. #include <functional>
  3. using namespace std;
  4.  
  5. int add(int a,int)> cppstyle;
  6. cppstyle = add;
  7.  
  8. auto l = [cppstyle] (int a,int b) {return cppstyle(a,b);};
  9.  
  10. cout << l(10,30) <<"\n";
  11. }

捕获的值是否类似于将值作为参数传递?还是捕捉有一些特殊的意义?

解决方法

捕获的参数和传球参数之间的差异可以用类比来看出.考虑下面的函数对象:
  1. struct Capture {
  2. int &i;
  3. int const j;
  4. public:
  5. Capture(int &_i,int &_j) : i(_i),j(_j) {}
  6. int operator()(int const a,int const b) {
  7. i *= j;
  8. return a * b;
  9. }
  10. };

函数对象类Capture中有两个成员变量i和j.还有重载的operator(),它需要两个输入参数.现在考虑以下lambda:

  1. int i,j;
  2. [&i,j](int const a,int const b) {
  3. i *= j;
  4. return a * b;
  5. };

类Capture的成员变量与lambda捕获类似(即[& i,j]),而重载的operator()a和b的输入参数类似于上面所示的lambda的输入参数a和b .

也就是说,如果您将lambda视为函数对象,则其捕获是函数对象(即其成员变量)的状态,而其输入参数将是重载运算符()的输入参数.

猜你在找的C&C++相关文章