小编Liv*_*ntu的帖子

为什么尽管对象被删除,但 lambda 中的按值捕获仍然有效?

为什么这段代码有效?

// 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中d​​ivisor仍然复制成功呢?当执行过滤器中的函数时,除数应该不存在。

c++ lambda capture

0
推荐指数
1
解决办法
93
查看次数

标签 统计

c++ ×1

capture ×1

lambda ×1