C + + 11 lambdas 是否捕获了它们不使用的变量?

当我使用 [=]来表明我希望所有的局部变量被 lambda 中的值捕获,这会导致函数中的 所有局部变量被复制,还是仅仅是所有的局部变量 Lambda 使用的

例如,如果我有:

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

即使我没有在 lambda 中使用它,我的 _ big _ Vector 会被复制吗?

26246 次浏览

捕获捕获列表中明确命名的每个变量。默认的捕获将只捕获(a)在捕获列表中没有明确命名的变量和(b) lambda 表达式主体中的 用过变量。如果一个变量没有被明确命名,并且你没有在 lambda 表达式中使用这个变量,那么这个变量就不会被捕获。在您的示例中,没有捕获 my_huge_vector

每个 C + + 115.1.2[ expr.prim.lambda ]/11:

如果一个 Lambda 表情有一个相关的 Catch-default 捕获-默认和它的 复合陈述 用途 this或一个具有自动存储持续时间的变量,而且 用过的实体没有被显式捕获,那么这个 用过的实体被称为被隐式捕获。

您的 lambda 表达式有一个相关的捕获默认值: 默认情况下,使用 [=]按值捕获变量。

当且仅当使用变量(在术语“使用”的一个定义规则意义上)是隐式捕获的变量。由于在 lambda 表达式的主体(“复合语句”)中根本不使用 my_huge_vector,所以它不会被隐式捕获。

继续5.1.2/14

如果以下情况,则通过复制捕获实体

  • 它是隐式捕获的,并且 Catch-default 捕获-默认=或者如果
  • 它是通过一个不包含 &的捕获显式捕获的。

由于您的 my_huge_vector没有被隐式捕获,也没有被显式捕获,所以它根本不会被捕获,不管是通过拷贝还是通过引用。

不,my_huge_vector不会被捕获。 [=]意味着所有的 用过变量都在 lambda 中被捕获。