做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?

2 Solutions collect form web for “做c ++ 11 lambdas捕获他们不使用的variables?”

捕获列表中明确命名的每个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中捕获。

  • 知道lambda微积分有多大帮助?
  • 什么时候应该在ECMAScript 6中使用箭头function?
  • 为什么我们需要纤维
  • 无法首先将其转换为委托或expression式树types,不能将lambdaexpression式用作dynamic调度操作的参数
  • 是否使用lambda函数/expression式支持constexpr?
  • Lambdaexpression式将数组/string列表转换为数组/列表整数
  • 使用GCC语句expression式的匿名函数
  • 如何使用lambdaexpression式检查元素是否存在?
  • 使用包含在entity framework4中的lambdaexpression式
  • 为什么java.util.Collection没有实现新的Stream接口?
  • Collectors.toMap()keyMapper - 更简洁的expression式?