我知道捕获列表使变量在lambda函数体内可用,如下所示:
int pos(0);
std::function<void()> incPos = [&pos](){ ++pos; };
incPos(); //pos is now 1
Run Code Online (Sandbox Code Playgroud)
但是,捕获实际上如何在编译器级别上工作?捕获的地址或捕获的值存储在哪里?
每个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关键字,否则无法修改捕获的变量的原因.
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |