我很难理解 lambda 函数和捕获变量的机制,所以我做了一些测试,得出了非常奇怪的结论。那是:
class ClassA
{
public:
std::function<void()> lambda;
void DoYourStuff()
{
int x;
x = 1;
lambda = [=] () { printf("A %d\n", x);};
lambda();
x = 2;
lambda();
}
};
class ClassB
{
public:
std::function<void()> lambda;
int x;
void DoYourStuff()
{
x = 1;
lambda = [=] () { printf("B %d\n", x);};
lambda();
x = 2;
lambda();
}
};
注意:唯一的区别在于 x 变量的位置;ClassA 和 ClassB 的函数有不同的输出!
A 1
A 1
B 1
B 2
所以我的问题是:
- 这是期望的行为吗?
- 如果我在 ClassA 中使用 [&] 而不是 [=],这些 lambda 表达式是否相同?
- 关于 [=] 何时实际复制是否有一些一般规则?
- 什么时候应该通过 lambdas 捕获变量?
- 我可以强制 lambda 重新捕获变量吗?
谢谢