查看页面上的示例:
https://en.cppreference.com/w/cpp/algorithm/generate
它使用 lambda:
std::generate(v.begin(), v.end(), [n = 0] () mutable { return n++; });
变量 n
没有在 lambda 之前的任何地方声明。
在 MSVC 14 和 GCC 9.1 中尝试过此代码段后,它确实适用于两者。
尝试在以下位置找到对此行为的引用:
https://en.cppreference.com/w/cpp/language/lambda
但找不到任何地方说可以在 lambda 的捕获区域中声明新变量。
这是预期的行为吗?如果是,有什么限制?
最佳答案
在您链接到的引用中,它位于 lambda capture section 中,列表中的第 3 项。
再往下看(在“C++14 以来”部分):
A capture with an initializer acts as if it declares and explicitly captures a variable declared with type
auto
[强调我的]
它明确解释了该捕获子句的行为。
关于C++ lambda 按值捕获,无需提前声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56579764/