我最近开了一个讨论,下面的问题就是从那个讨论中出现的。这个问题是那个讨论的延续。以下是代码:
#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);
}
在这个例子中,代码做了我预期的事情,更具体地说,它打印出从2到21的所有数字。然而,如果我的main
函数像这样:
int main()
{
auto getNum = ([](int starter) {
return [starter]() mutable {
return ++starter;
};
})(1);
tester(getNum);
tester(getNum);
}
然后输出的将是2到11的数字重复两次。我无法解释为什么这段代码产生这样的输出,即使这两个代码片段之间唯一的区别就是lambda函数
mylambda
定义的位置和方式。