如何让构造函数每次调用时创建不同的 lambda?

Iva*_*kov 3 c++ lambda constructor

我有这个简单的代码:

#include <iostream>
#include <functional>

class a {
public:
    a() {
        func = [] {
            static int i = 0;
            i++;
            std::cout << i << std::endl;
        };
    }
    std::function<void()> func;
};

int main()
{
    a a1;
    a1.func();
    a a2;
    a2.func();
}
Run Code Online (Sandbox Code Playgroud)

我期望这样的输出:

1
1
Run Code Online (Sandbox Code Playgroud)

但它却是:

1
2
Run Code Online (Sandbox Code Playgroud)

然后我检查了两个实例中 lambda 表达式的内存地址a,它们是相同的。这意味着 lambda 创建一次,然后在所有实例中使用。我正在寻找的是让构造函数每次被调用时都创建一个不同的 lambda。我关闭了编译器优化,但没有效果。

信息:我正在使用 MSVC。

Que*_*tin 6

从概念上讲,您确实有单独的 lambda 实例。您所目睹的可能是编译器优化,但实际问题是 makestatici函数体本身拥有,因此由 lambda 的所有实例共享。

相反,您想要的是为每个 lambda 实例创建i一个成员,您可以使用扩展捕获列表来完成此操作:

func = [i = 0]() mutable {
    i++;
    std::cout << i << std::endl;
};
Run Code Online (Sandbox Code Playgroud)