Liv*_*ntu 0 c++ lambda capture
为什么这段代码有效?
// Online C compiler to run C program online
#include <cstdio>
#include <vector>
#include <functional>
#include <memory>
#include <iostream>
using FilterContainer = std::vector<std::function<bool(int)>>;
FilterContainer filters;
class Widget
{
public:
int divisor = 0;
void addFilter() const;
Widget(int a):divisor(a){}
};
void Widget::addFilter() const
{
auto divisorCopy = divisor;
filters.emplace_back(
[=](int value)
{ return value % divisorCopy == 0; }
);
}
void doSomeWork()
{
auto pw = std::make_unique<Widget>(5);
pw->addFilter();
}
int main() {
doSomeWork();
std::cout<< filters[0](10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
doSomeWork()之后对象widget被删除了,那么为什么divisorCopy中divisor仍然复制成功呢?当执行过滤器中的函数时,除数应该不存在。
您不捕获对象,而是按值Widget捕获局部变量。divisorCopy
这当然会创建该divisorCopy值的副本,并存储在 lambda 对象内部。该 lambda 局部副本与原始divisorCopy变量是独立且不同的。
当addFilter函数返回时,lambda 本地副本仍然存在并且可以使用。
物体的破坏Widget与发生的事情无关。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |