为什么lambda取变量的初始值

时间:2018-09-13 06:38:02

标签: c++ lambda stl

问题是程序打印ID:0,ID:1,ID:2、42的原因 而不是id:42,id:43,id: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 :(得分:8)

因为id是按值捕获的,即它被复制了。并且在声明lambda时(即,发生捕获时),id的值为0

您可能希望将其更改为通过引用捕获。

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

顺便说一句:在这种情况下,mutable变得多余了。

LIVE