免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1416 | 回复: 1
打印 上一主题 下一主题

lambda函数里面,使用&和使用=,效果不是我所想的,很奇怪! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-10 18:32 |只看该作者 |倒序浏览
5可用积分
本帖最后由 zuiwei 于 2012-04-10 18:37 编辑

我定义一个vector,然后循环让每个vector的元素加上2.下面这段代码没有问题(VC2010):

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<iterator>
  4. #include<string>
  5. #include<vector>
  6. using namespace std;
  7. void main(){
  8.     int add=2;
  9.     vector<int> vi;
  10.     vi.push_back(1);
  11.     vi.push_back(2);
  12.     for_each(vi.begin(),vi.end(),[=](int& i){i+=add;});
  13.     copy(vi.begin(),vi.end(),ostream_iterator<int>(cout,","));
  14. }
复制代码
程序运行打印3,4
但是如果我把lambda函数改成
for_each(vi.begin(),vi.end(),[&](int i){i+=add;});
那么copy那一行的打印结果就是1,2,说明vector的元素没有被修改

这是为什么呢? 我在声明lambda函数的时候已经用了[&],那么后面的int i就不需要再用引用了吧?
我的想法错在哪里?

最佳答案

查看完整内容

for_each(beg, end, f)会将[beg,end)的元素依次传递给f: f(*beg)。如果f的参数不是引用, 就达不到修改[beg, end)的目的。所以[ ](int& /*这里必须是引用*/i ){ i += add; } 才能修改vi。lambda表达式中的花括号部分:{ i += add; } 中的i是形式参数, 会以vi的元素作为实际参数调用。而add, 是产生这个lambda表达式的环境中的add, 也就是main 第1行: int add=2;[/*如果这里是*/=], 花括号里的add是第1行的一个复制; [/*如 ...

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2012-04-10 18:32 |只看该作者
for_each(beg, end, f)
会将[beg,end)的元素依次传递给f: f(*beg)。
如果f的参数不是引用, 就达不到修改[beg, end)的目的。
所以[ ](int& /*这里必须是引用*/i ){ i += add; }  才能修改vi。

lambda表达式中的花括号部分:{ i += add; } 中的i是形式参数, 会以vi的元素作为实际参数调用。
而add, 是产生这个lambda表达式的环境中的add, 也就是main 第1行: int add=2;
[/*如果这里是*/=], 花括号里的add是第1行的一个复制;  [/*如果这里是*/&], 花括号里的add是第1行的一个引用。

int sum = 0;
for_each(beg, end, [=](int x) { sum += x; });
cout<<sum; // 输出0。 花括号中的sum是前一行的一个复制

int sum = 0;
for_each(beg, end, [&](int x) { sum += x; });
cout<<sum; // 输出 [beg, end) 元素的和。花括号中的sum是前一行的引用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP