C++ 理解C++;lambda捕获规范

C++ 理解C++;lambda捕获规范,c++,lambda,c++11,C++,Lambda,C++11,这有什么用?具体地说,我想将“this”对象中20个字段中的3个字段传递到lambda中。如果我使用[&],它将只接受我使用的3个字段吗?它们是通过引用还是通过值传递 谢谢 这个([&])做什么 它指定通过引用捕获所有(隐式)捕获。也就是说,它的行为就像存在闭包对象的隐藏引用成员一样,由实际捕获的对象初始化 “this”对象中20个字段中有3个字段要传递到lambda中。如果我使用[&],它将只接受我使用的3个字段吗 否,如果仅捕获此对象的成员,则仅捕获此指针(始终按值) 这个([&])做什么

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

谢谢

这个([&])做什么

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

“this”对象中20个字段中有3个字段要传递到lambda中。如果我使用[&],它将只接受我使用的3个字段吗

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

这个([&])做什么

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

“this”对象中20个字段中有3个字段要传递到lambda中。如果我使用[&],它将只接受我使用的3个字段吗


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

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

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

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

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


在前面提到的上下文中,您提到了成员变量:这些变量永远不会被捕获,因为它们不在本地范围内。可以捕获的是
这个
,但由于它是不可变的,所以总是由值捕获。说到不可变:默认情况下,变量按值捕获
const
。如果要更改它们,需要通过在参数列表和lambda函数体之间提到
mutable
,使lambda函数的参数设置为
mutable

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

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


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

“如果我使用
[&]
,它将只使用我使用的3个字段吗?”不,它将使用单个字段–
。“它们是通过引用还是通过值传递的?”
&
表示通过引用传递;如果它是
=
,那么它将是pass-by-val。但是考虑到您只捕获一个指针,在这种情况下没有什么区别。@ildjarn:“不,它将使用一个字段–this。”不,它不会,但这只是因为您无法通过引用捕获
这个
。当您尝试使用成员变量时,如果没有隐式地按值捕获所有内容或显式地捕获
,编译器应该会出错@Nicol:那么,在GCC 4.7.2和VC++2012中工作的事实是否意味着上述编译器中存在错误?@ildjarn:事实上,请点击该按钮。我检查了规范,没有任何语言阻止从默认引用捕获中捕获
this
。您不能通过引用显式地捕获它,但显然您可以隐式地这样做。这是奇怪的不一致,但显然是合法的。“如果我使用
[&]
只需要