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

时间:2011-05-30 23:02:45

标签: c++ lambda c++11

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

所以,例如,如果我有:

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

my_huge_vector会被复制,即使我不在lambda中使用它吗?

2 个答案:

答案 0 :(得分:109)

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

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

  

如果 lambda-expression 具有关联的 capture-default 及其复合语句 odr-uses this或具有自动存储持续时间且 odr-used 实体的变量未被显式捕获,则称​​ odr-used 实体被隐式捕获。

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

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

继续§5.1.2/ 14

  

如果

,则通过副本捕获实体      
      
  • 隐式捕获, capture-default =
  •   
  • 使用不包含&的捕获显式捕获它。
  •   

由于未隐式捕获my_huge_vector且未明确捕获{{1}},因此不会通过复制或引用来捕获它。

答案 1 :(得分:15)

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