这是做什么的?具体来说,我想要传递给 lambda 的“this”对象中有 20 个字段中的 3 个字段。如果我使用 [&] 会只占用我使用的 3 个字段吗?它们会通过引用还是值传递?
谢谢
这个 ([&]) 有什么作用?
它指定所有(隐式)捕获都是通过引用捕获的。也就是说,它的行为就好像存在闭包对象的隐藏引用成员,由实际捕获的对象初始化。
我想传递给 lambda 的“this”对象中有 20 个字段中有 3 个字段。如果我使用 [&] 会只占用我使用的 3 个字段吗?
this
不,如果您仅捕获对象的成员,则仅捕获this
指针(始终按值)。
捕获规范告诉编译器如何捕获不同的变量。Using[&]
意味着 lambda 中提到的本地范围内的所有变量都将通过引用来引用,即,只要使用 lambda,它们就需要保留。对这些变量的任何更改都将反映在原件中。您还可以使用[=]
which 将存储正在使用的变量的副本。如果你想混合访问,你可以设置一个默认值并覆盖以后引用变量的方式,例如,[=,&foo]
捕获所有通过值引用的变量,除了foo
通过引用捕获的变量。
在任何情况下,lambda 对象只会存储对 lambda 函数内部实际使用的变量或捕获中明确(按名称)提及的变量的引用或副本(感谢 jpalecek 指出始终存储明确提及的变量)。
在提到的上下文中,您提到了成员变量:它们永远不会被捕获,因为它们不在本地范围内。可以捕获的是this
,但由于它是不可变的,所以它总是被价值捕获。说到不可变:变量默认按值捕获const
。如果要更改它们,则需要通过在参数列表和 lambda 函数的主体之间mutable
提及来创建 lambda 函数。mutable
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.