我似乎在C++的lambda机制中错过了一些要点。以下是代码:
std::vector<int> vec (5);
int init = 0;
std::generate(begin(vec), end(vec), [init]() mutable { return ++init; });
for (auto item : vec) {
std::cout << item << " ";
}
std::cout << std::endl << init << std::endl;
如果没有mutable
,编译会失败,因为我正在lambda中更改init
。现在,我的理解是lambda针对每个向量项使用新的副本来调用,该副本为0。 所以,必须每次返回1。 但是,这段代码的输出是:
1 2 3 4 5
0 看起来
generate
仅在其执行的开始时通过复制捕获init
,但为什么?它是否应该像这样工作?
for
循环,并在循环体中执行类似于vec[i] = ([init] () mutable {return ++init;})();
的操作,那么你可能会得到你所描述的结果,因为这样会在每次迭代时创建一个 lambda 函数。 - Bakuriugenerate(begin, end, lambda)
应该做同样的事情。 - IgorStack