C ++ lambda按值捕获而无需提前声明变量

时间:2019-06-13 11:45:40

标签: c++ c++11

查看页面上的示例:

https://en.cppreference.com/w/cpp/algorithm/generate

它使用lambda:

std::generate(v.begin(), v.end(), [n = 0] () mutable { return n++; });

在lambda之前的任何地方都没有声明变量n

已经在MSVC 14和GCC 9.1中尝试了此代码段,但在这两者上都可以使用。

尝试在以下位置找到对此行为的引用:

https://en.cppreference.com/w/cpp/language/lambda

但是找不到它说可以在lambda的捕获区域中声明新变量的任何地方。

这是预期的行为吗?限制是什么?

1 个答案:

答案 0 :(得分:6)

在链接到的引用中,它位于lambda capture section中,列表中的项目编号为3。

再往下(在“ C ++ 14起”部分):

  

使用初始化程序进行捕获的方式就好像声明,并明确捕获使用类型auto声明的变量

[重点突出]

其中明确说明了该捕获子句的行为。