Проблема с передачей значений в лямбду - PullRequest
2 голосов
/ 07 марта 2020

Вот мой код:

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;
}

и результат:

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

, как вы можете видеть , для каждого l oop, 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. Но зачем копировать только один раз, а не несколько раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...