首页 > 解决方案 > 关于在 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>

标签: c++lambda

解决方案


推荐阅读