如果我通过调用fun1()
赋值,则lambda外的x变量将被破坏(无法读取内存),但如果我运行fun2()
,一切都很好。为什么?指针的副本仍指向同一件事吗?那为什么fun1()不起作用?
int *x = NULL;
auto fun1 = [x]() mutable
{
x = new int(5);
};
auto fun2 = [&x]()
{
x = new int(5);
};
答案 0 :(得分:2)
auto fun1 = [x]() mutable { ... }
按副本捕获x
,因此会修改x
的副本。当lamdba返回时,您的x
仍未分配。
auto fun2 = [&x]() { ... }
通过引用捕获x
,因此您确实在修改x
。
这与lambdas无关:常规函数(see value and reference semantics entry in the C++ FAQ)
存在相同的行为答案 1 :(得分:1)
我认为用户在这里感到困惑,因为它是一个指针,但指针也是变量,也可以通过值或引用传递。
这是x
本身,而不是x
点至关重要的地方。您需要修改指针,而不是指向它的位置。因此,您必须通过引用将它传递给lambda。
如果您感兴趣的是*x
实际上,并且x
本身不会被修改(指向别处),那么您只需将其传递给lambda值,就像你可以按价值将它传递给一个函数。