这是做什么的?具体来说,我在'this'对象的20个中有3个字段,我想传递给lambda。如果我使用[&]它只会占用我使用的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
。