当我使用[=]
来表示我希望通过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中使用它吗?
答案 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中捕获所有使用的变量。