【发布时间】:2018-06-23 05:01:45
【问题描述】:
我最近开了this讨论,下面的问题就是由此而来。这个问题是那种讨论的延续。代码如下:
#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 的数字,重复两次。我无法解释为什么它会产生这个输出,即使这两段代码之间的唯一区别是 mylambda 函数的定义位置和方式。
【问题讨论】: