通过std::function&访问lambda中的变量,引用类型没有起到作用,如何解决?(语言-c++)

img


myInvoke函数的参数是引用传递,为什么在经过三次调用myInvoke函数后,i的值不变呢?结果为什么是3个1,不应该是1 2 3 吗?

你是用lamda表达式直接作为函数的参数,但lamda作为std::function参数实际传的只是一个副本,所以相当于你是对这个副本引用,故没意义。


struct Lambda{
    //Capture by value
    Lambda(int i):_i(i){}

    void operator()() const{
        std::cout << ++_i << '\n';
    }
    mutable int _i;
};
void invoke2(const Lambda& fn) // # PASS LAMBDA BY REFERENCE
{
    fn();
}
 
int main()
{
    int i{ 0 };
 
    // Increments and prints its local copy of @i.
    Lambda count{i};

    invoke2(count);//1
    invoke2(count);//2
    invoke2(count);//3
 
    return 0;
}

正确的代码如下:

#include <iostream>
#include <functional>

void myInvoke(const std::function<void()>& fn)
{
fn();
}

int main()
{
int i = 0;
auto count{[&i]()mutable{
std::cout<<++i<<'\n';
}};
myInvoke(count);
myInvoke(count);
myInvoke(count);
return 0;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^