Mar*_*ara 5 c++ lambda closures c++11
我最近打开了这个讨论,从中可以得出以下问题.这个问题是一种持续的讨论.这是代码:
#include <iostream>
#include <functional>
using namespace std;
std::function<int(void)> mylambda(int starter){
return [starter]() mutable {
return ++starter;
};
}
void tester_wrapper(const std::function<int(void)>& cb, int counter){
if (counter == 10)
return;
else{
cout << cb() << endl;
tester_wrapper(cb, counter + 1);
}
}
void tester(const std::function<int(void)>& cb){
tester_wrapper(cb, 0);
}
int main()
{
auto getNum = mylambda(1);
tester(getNum);
tester(getNum);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,代码执行我所期望的,更具体地说,它打印从2到21的所有数字.但是,如果我的main函数是这样的:
int main()
{
auto getNum = ([](int starter) {
return [starter]() mutable {
return ++starter;
};
})(1);
tester(getNum);
tester(getNum);
}
Run Code Online (Sandbox Code Playgroud)
然后输出将是重复两次的2到11的数字.即使两段代码之间的唯一区别在于mylambda函数的定义位置和方式,我也无法解释为什么它会产生这个输出.
因为lambda闭包类型与std::function引用无关.这些是不同的类型.您不能将引用std::function直接绑定到lambda对象.
然而,lambda对象可以转换为a std::function.所以会发生什么是编译器创建一个std::function绑定到该const引用的临时文件.在原始问题中创建非常相同的情况.因为每次调用都tester需要另一个临时对象.Temporaries只活到完全表达的结束,使他们恢复活力.
在第一个代码示例中,您已经std::function在main中有一个对象.那个直接绑定到引用,因此您tester使用相同的引用对象进行调用.