如何捕获lambda的列表实际上在C++ 11中工作?

iFr*_*cht 7 c++ lambda c++11

我知道捕获列表使变量在lambda函数体内可用,如下所示:

int pos(0);
std::function<void()> incPos = [&pos](){ ++pos; };
incPos(); //pos is now 1
Run Code Online (Sandbox Code Playgroud)

但是,捕获实际上如何在编译器级别上工作?捕获的地址或捕获的值存储在哪里?

Pra*_*ian 9

每个lambda表达式都会生成一个唯一的函数对象(闭包),它将捕获的变量存储为数据成员.例如,代码中的lambda表达式将由编译器转换为类似的东西:

struct __uniquely_named_lambda
{
  __uniquely_named_lambda(int& pos)
  : pos(pos) {}
  int& pos;

  void operator()() const
  { ++pos; }
};
Run Code Online (Sandbox Code Playgroud)

调用lambda只是一个调用operator().

数据成员是您通过引用捕获的引用.如果按价值捕获,那将是一个普通的int.另外请注意,产生的operator()const默认.这就是除非使用mutable关键字,否则无法修改捕获的变量的原因.