我知道捕获列表使变量在lambda函数体内可用,如下所示:
int pos(0);
std::function<void()> incPos = [&pos](){ ++pos; };
incPos(); //pos is now 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
关键字,否则无法修改捕获的变量。