为什么lambda采用变量的初始值

arv*_*ind 1 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;
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 8

因为id是按值捕获的,即它被复制.当声明lambda时(即捕获发生时)id的值为0.

您可能希望将其更改为按引用捕获.

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

顺便说一句:这种情况mutable变得多余了.

生活