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

HC4*_*ica 120 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; });
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*lis 112

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

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

如果lambda表达式具有关联的capture-default及其复合语句 odr-uses this或具有自动存储持续时间的变量并且未明确捕获使用odr的实体,则称该odr使用的实体被隐式捕获.

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

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

继续§5.1.2/ 14

如果是,则通过副本捕获实体

  • 它是隐式捕获的,捕获默认值=或者如果
  • 它是使用不包含的捕获显式捕获的&.

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

  • 你有一个神圣的报价吗? (9认同)

Tho*_*nor 16

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

  • 是的.注意,_used_是一个技术词,但实际上意味着一个定义规则_used_.因此,例如,考虑`void f(){const int size(10); [] {int x [size]; }; }`.在这里,没有捕获`size`,但这没关系,因为它没有在ODR意义上使用.(Visual C++ 2010不接受此代码,因为规范在VC10发布后或由于错误而更改,可能会在即将发布的版本中修复; g ++ 4.5.1接受它.) (6认同)