c++ - 关于在 lambda 中传递引用的值传递问题
问题描述
这是我的代码:</p>
int main() {
std::cout << "Hello, World!" << std::endl;
std::vector<int> v{4,3,2,1,3,3,3,3,4,3,2,1,3,3,3,3};
std::mutex mtx;
int i2=2;
int i3=2;
for_each(std::execution::par,v.begin(),v.end(),[i2,i3](const int& date)mutable{
_sleep(1000);
i2++;
std::cout<<&i2<<std::endl;
std::cout<<i2<<std::endl;
});
return 0;
}
结果是:</p>
0000001EF70FF540
0000001EF6FFF370
0000001EF6AFF240
0000001EF6EFF350
0000001EF71FF7E0
33
3
3
3
0000001EF72FFA70
3
0000001EF73FF7E0
3
0000001EF74FF6E0
3
0000001EF75FF8C0
3
0000001EF76FF9B0
3
0000001EF77FF5D0
3
0000001EF71FF7E0
3
0000001EF6AFF240
0000001EF70FF540
0000001EF6FFF370
0000001EF6EFF350
3
3
3
3
如你所见,对于每个循环,i2 都有一个新副本,并在该副本上进行增量。所以我们得到 2++,答案是 3。
但是当我对该代码进行一点改动时:更改
for_each(std::execution::par,v.begin(),v.end(),[i2,i3](const int& date)mutable{
至
for_each(std::execution::par,v.begin(),v.end(),[i2,&i3](const int& date)mutable{
因为 i2 总是按值传递,所以输出应该保持不变。但现在输出是:
0000003ACCCFFB20
0000003ACCCFFB20
0000003ACCCFFB20
7
0000003ACCCFFB20
0000003ACCCFFB20
7
7
7
7
0000003ACCCFFB20
8
0000003ACCCFFB20
9
0000003ACCCFFB20
10
0000003ACCCFFB20
11
0000003ACCCFFB20
12
0000003ACCCFFB20
13
0000003ACCCFFB20
0000003ACCCFFB20
0000003ACCCFFB20
0000003ACCCFFB20
0000003ACCCFFB20
18
1818
18
18
我查过那个地址,确实是原变量i2的一份拷贝。但是为什么只拷贝一次而不是多次呢?</p>
解决方案
推荐阅读
- istio - 在 Istio 中隐藏有关策略失败的错误消息
- c++ - 如何将谷歌命令行标志作为参数传递给 GDB
- python - 如何按特定顺序从列表中获取唯一值?
- javascript - JavaScript使用console.log获取带有引号的嵌套数组(1级)保留数字
- php - Laravel 雄辩地将数组作为对象
- javascript - jQuery 不响应第二个“this”
- spring-restcontroller - Spring SpEL 使用列表设置 RequestMapping 路径
- javascript - 将用户输入数据添加到 React 应用程序中的 consts
- git - git 恢复本地未提交的更改
- javascript - 如何使用时间戳从 mongodb 获取最后 7 天?