做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-使用
this
variables或具有自动存储持续时间的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中捕获。