1

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

谢谢

4

3 回答 3

8

这个 ([&]) 有什么作用?

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

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

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

于 2012-10-03T23:02:14.177 回答
3

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

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

在提到的上下文中,您提到了成员变量:它们永远不会被捕获,因为它们不在本地范围内。可以捕获的是this,但由于它是不可变的,所以它总是被价值捕获。说到不可变:变量默认按值捕获const。如果要更改它们,则需要通过在参数列表和 lambda 函数的主体之间mutable提及来创建 lambda 函数。mutable

于 2012-10-03T23:04:47.317 回答
2

Using [&] as your capture specification in a C++11 lambda simply means that any variable which is referenced inside the lambda will be treated as if it implicitly were specified using &varname in the capture specification. The lambda will not capture any unreferenced variable.

于 2012-10-03T23:02:43.040 回答