如何解决c ++ 11 lambda是否捕获不使用的变量?
| 当我使用[=]
表示我希望通过lambda中的值捕获所有局部变量时,是否会导致函数中的所有局部变量被复制,或者仅导致lambda使用的所有局部变量?
因此,例如,如果我有:
vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int + i; });
即使我不在lambda中使用my_huge_vector,它也会被复制吗?
解决方法
捕获列表中明确命名的每个变量均被捕获。默认捕获将仅捕获在(a)在捕获列表中未明确命名和(b)在lambda表达式主体中使用的变量。如果未明确指定变量,并且您未在lambda表达式中使用该变量,则不会捕获该变量。在您的示例中,未捕获
my_huge_vector
。
根据C ++ 11§5.1.2[expr.prim.lambda] / 11:
如果lambda表达式具有关联的capture-default,并且其复合语句odr使用this
或具有自动存储持续时间的变量,并且未显式捕获odr使用的实体,则称该odr使用的实体被隐式捕获。
您的lambda表达式具有关联的捕获默认值:默认情况下,您使用[=]
按值捕获变量。
当且仅当使用了一个变量(在“一个定义规则”中,术语“已使用”的含义)是隐式捕获的变量。由于在lambda表达式的主体(\“ compound statement \\”)中根本不使用my_huge_vector
,因此不会隐式捕获它。
继续第5.1.2 / 14节
如果存在,则通过复制捕获实体
它被隐式捕获,并且捕获默认值为=
,或者
使用不包含“ 7”的捕获显式捕获它。
由于您的“ѭ2”不会被隐式捕获,也不会被显式捕获,因此根本不会通过复制或引用来捕获它。
, 不,my_huge_vector
不会被捕获。 “ 0”表示所有使用的变量都在lambda中捕获。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。