繁体   English   中英

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

[英]How do capture lists of lambdas actually work in C++11?

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

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

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

每个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关键字,否则无法修改捕获的变量的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM