微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c ++ 11 lambda是否捕获不使用的变量?

如何解决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 举报,一经查实,本站将立刻删除。