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

时间:2014-05-06 16:01:01

标签: c++ c++11 lambda

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

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

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

1 个答案:

答案 0 :(得分:9)

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

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

  void operator()() const
  { ++pos; }
};

调用lambda只是调用operator()

数据成员是您通过引用捕获的引用。如果按值捕获,则为int。另请注意,默认情况下,生成的operator()const。这就是为什么除非使用mutable关键字,否则无法修改捕获的变量。