理解C ++ lambda捕获规范中的[&]

时间:2012-10-03 22:57:49

标签: c++ lambda c++11

这是做什么的?具体来说,我在'this'对象的20个中有3个字段,我想传递给lambda。如果我使用[&]它只会占用我使用的3个字段吗?他们会通过引用还是价值来传递?

由于

3 个答案:

答案 0 :(得分:8)

  

这([&])做了什么?

它指定通过引用捕获所有(隐式)捕获。也就是说,它的行为就像闭包对象的隐藏引用成员一样,由实际捕获的对象初始化。

  

我在'this'对象的20个中有3个字段,我想传递给lambda。如果我使用[&]它只会占用我使用的3个字段吗?

不,如果您只捕获this对象的成员,则只捕获this指针(始终按值)。

答案 1 :(得分:2)

在C ++ 11 lambda中使用[&]作为捕获规范只是意味着在lambda中引用的任何变量都将被视为在捕获规范中使用&varname隐式指定它。 lambda不会捕获任何未引用的变量。

答案 2 :(得分:2)

捕获规范告诉编译器如何捕获不同的变量。使用[&]意味着lambda中提到的本地范围内的所有变量都将通过引用引用,即,只要使用lambda,它们就需要保持不变。对这些变量的任何更改都将反映在原始变量中。您还可以使用[=]来存储正在使用的变量的副本。如果要混合访问权限,可以设置默认值并覆盖之后引用变量的方式,例如,[=,&foo]捕获除引用参考捕获的foo之外的所有值引用的变量。

在任何情况下,lambda对象只存储lambda函数内实际使用的变量的引用或副本,或者捕获中提到的显式(按名称)(感谢jpalecek指出明确提到的变量总是存储的)。

在上面提到的上下文中,您提到了成员变量:这些变量从未被捕获,因为它们不在本地范围内。可以捕获的是this,但由于它是不可变的,因此它总是按值捕获。说到不可变:变量默认按值const捕获。如果要更改它们,则需要在参数列表和lambda函数体之间提及mutable来生成lambda函数mutable