我似乎错过了 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,并使用 init
的 新副本,即 0。因此,每次都必须返回 1。但是这段代码的输出是:
1 2 3 4 5
0
看起来 generate
通过副本捕获 init
在其执行开始时 只捕获一次。但为什么?它应该像这样工作吗?
原文由 IgorStack 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是不正确的。 lambda 只是另一种创建类并为其提供
operator()
的方式。 lambda 的[]
部分描述了成员变量以及它们是通过引用还是通过值捕获的。 lambda 的()
部分是 --- 的参数列表,而operator()
{}
部分是该函数的主体。mutable
部分告诉编译器使operator()
非const
因为它是const
默认为 —a375b3418f43cf8e7a8所以
变成
为了简洁起见,我在这里使用了一个结构,但 lambda 被指定为类类型,因此可以使用
class
。这意味着
init
init
与上一次迭代中的 --- 相同,因为您只捕获一次。记住这一点很重要当函数返回并使用它是未定义的行为时,将为您留下对
foo
的悬空引用。