[英]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.