繁体   English   中英

c++11 lambdas 是否捕获他们不使用的变量?

[英]Do c++11 lambdas capture variables they don't use?

当我使用[=]表示我希望通过 lambda 中的值捕获所有局部变量时,这是否会导致 function 中的所有局部变量被复制,或者只是Z945F3FC4495168A476B 使用的所有局部变量?

因此,例如,如果我有:

vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int + i; });

是否会复制 my_huge_vector,即使我不在 lambda 中使用它?

捕获列表中明确命名的每个变量都会被捕获。 默认捕获将仅捕获 (a) 未在捕获列表中明确命名和 (b) 在 lambda 表达式的主体中使用的变量。 如果变量没有明确命名并且您没有在 lambda 表达式中使用该变量,则不会捕获该变量。 在您的示例中,未捕获my_huge_vector

根据 C++11 §5.1.2[expr.prim.lambda]/11:

如果lambda 表达式具有关联的捕获默认值,并且其复合语句odr-使用this或具有自动存储持续时间的变量,并且未显式捕获使用 odr的实体,则称使用odr 的实体被隐式捕获.

您的 lambda 表达式具有关联的捕获默认值:默认情况下,您使用[=]按值捕获变量。

当且仅当使用变量时(在“使用”一词的单一定义规则意义上)是隐式捕获的变量。 由于您根本没有在my_huge_vector表达式的主体(“复合语句”)中使用 my_huge_vector,因此不会隐式捕获它。

继续 §5.1.2/14

一个实体被副本捕获,如果

  • 它被隐式捕获,并且捕获默认值为=或如果
  • 它是使用不包含&的捕获显式捕获的。

由于您的my_huge_vector没有被隐式捕获,也没有被显式捕获,因此根本不会通过复制或引用来捕获它。

不,不会捕获my_huge_vector [=]表示所有使用的变量都在 lambda 中捕获。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM