可变的lambda是否拥有自己的捕获值副本?

时间:2019-04-22 14:56:35

标签: c++ c++11 lambda

std::function<void()> create_function (args...)
{
    int x = initial_value (args...);

    return [x] () mutable
    {
        std::cout << x++ << std::endl;
    };
}

我发现我需要在lambda上使用mutable关键字,否则x是const。

如果我多次调用create_function,返回的函数对象将每个都有自己的x副本还是被共享?

为了澄清,如果我想在C ++ 11之前使用这种功能,则必须编写一个类来封装捕获,在这种情况下,我可以选择使x成为成员变量或全局/静态。如果x是const没关系。该语言如何针对不同的lambda实例指定x的存储方式?

1 个答案:

答案 0 :(得分:3)

如果捕获的值是值或参考,则

mutable不会更改。它只会改变常数。

您指定要在lambda捕获中使用值(副本)还是引用:

return [x] () mutable  // copies
{
    std::cout << x++ << std::endl;
};

return [&x] () mutable  // references
{
    std::cout << x++ << std::endl;
};

如果您感到困惑,则Lambda捕获始终被建模为非静态数据成员。