Почему лямбда принимает начальное значение переменной - PullRequest
0 голосов
/ 13 сентября 2018

Вопрос в том, почему программа печатает идентификатор: 0, идентификатор: 1, идентификатор: 2, 42 вместо идентификатора: 42, идентификатор: 43, идентификатор: 44, 45.

int main()
{

    int id = 0;
    auto f = [id] () mutable {
        std::cout << "id: " << id << std::endl;
        ++id; // OK
    };

    id = 42;
    f();
    f();
    f();
    std::cout << id << std::endl;
    return 0;
}

1 Ответ

0 голосов
/ 13 сентября 2018

Поскольку id фиксируется значением, то есть оно копируется. И когда лямбда объявлена ​​(т.е. когда происходит захват) id имеет значение 0.

Возможно, вы захотите изменить его на захват по ссылке.

auto f = [&id] () {
//        ^
    std::cout << "id: " << id << std::endl;
    ++id;
};

Кстати: для этого случая mutable становится лишним.

ЖИТЬ

...