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

Do mutable lambdas have their own copies of captured values?

本文关键字:副本 自己的 lambda 是否 可变      更新时间:2023-10-16
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是常量,那就没关系了。语言如何指定与 lambda 的不同实例相关的x存储?

如果

捕获的值是值或引用,mutable不会更改。它只会改变恒常性。

您可以指定是否需要在 lambda 捕获中使用值(副本(或引用:

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

Lambda 捕获始终建模为非静态数据成员,如果这是您的困惑。