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

我理解lambda功能和它在c 11中的目的.但是我不明白“捕获值”和“传递参数”之间的区别.
例如..

#include <iostream>
#include <functional>
using namespace std;

int add(int a,int b){
    return a+b;
}

int main(int argc, char** argv){

    function <int(int,int)> cppstyle;
    cppstyle = add;

    auto l = [] (function <int(int,int)> f,int a, int b) {return f(a,b);};

    cout << l(cppstyle,10,30) <<"\n";   
}

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

#include <iostream>
#include <functional>
using namespace std;

int add(int a,int b){
    return a+b;
}

int main(int argc, char** argv){

    function <int(int,int)> cppstyle;
    cppstyle = add;

    auto l = [cppstyle] (int a, int b) {return cppstyle(a,b);};

    cout << l(10,30) <<"\n";    
}

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

最佳答案
捕获的参数和传球参数之间的差异可以用类比来看出.考虑下面的函数对象:

struct Capture {
  int &i;
  int const j;
public:
  Capture(int &_i, int &_j) : i(_i), j(_j) {}
  int operator()(int const a, int const b) {
    i *= j;
    return a * b;
  }
};

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

int i, j;
[&i, j](int const a, int const b) {
  i *= j;
  return a * b;
};

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

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

转载注明原文:c – 在lambda函数中捕获和传递参数之间的差异 - 代码日志