首页 > 解决方案 > 为什么 lambda 取变量的初始值

问题描述

问题是为什么程序打印 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;
}

标签: c++lambdastl

解决方案


因为id被值捕获,即被复制。并且当声明 lambda 时(即发生捕获时)id具有0.

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

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

顺便说一句:对于这种情况mutable变得多余。

居住


推荐阅读