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。
从概念上讲,您确实有单独的 lambda 实例。您所目睹的可能是编译器优化,但实际问题是 makestatic
由i
函数体本身拥有,因此由 lambda 的所有实例共享。
相反,您想要的是为每个 lambda 实例创建i
一个成员,您可以使用扩展捕获列表来完成此操作:
func = [i = 0]() mutable {
i++;
std::cout << i << std::endl;
};
Run Code Online (Sandbox Code Playgroud)