做c ++ 11 lambdas捕获他们不使用的variables?

当我使用[=]来指示我希望所有局部variables被lambda中的值捕获时,会导致被复制的函数中的所有局部variables,还是lambda使用的所有局部variables?

所以,例如,如果我有:

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

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

捕获列表中明确命名的每个variables都被捕获。 默认的捕获将只捕获(a)未在捕获列表中明确命名的variables以及(b)在lambdaexpression式的主体中使用的variables。 如果一个variables没有明确的命名,并且你没有在lambdaexpression式中使用这个variables,那么这个variables就不会被捕获。 在你的例子中, my_huge_vector没有被捕获。

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

如果lambdaexpression式具有关联的capture-default,并且其复合语句 odr-使用 thisvariables或具有自动存储持续时间的variables,并且未明确捕获odr-used实体,则称odr-used实体被隐式捕获。

您的lambdaexpression式具有关联的捕获默认值:默认情况下,您使用[=]按值捕获variables。

当且仅当使用一个variables时(在“一个定义规则”中,术语“used”)是一个隐式捕获的variables。 由于在lambdaexpression式的主体(“复合语句”)中根本不使用my_huge_vector ,因此不会隐式捕获。

继续§5.1.2/ 14

如果一个实体被复制

  • 它被隐含地捕获,并且捕获 – 默认=或者如果
  • 它是明确捕获与不包含&的捕获。

由于你的my_huge_vector没有被隐式捕获,也没有明确捕获,所以根本不会被捕获,通过拷贝或引用。

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