c ++按值或引用在lambda中分配指针值

时间:2014-08-22 09:48:46

标签: c++ pointers c++11 lambda

如果我通过调用fun1()赋值,则lambda外的x变量将被破坏(无法读取内存),但如果我运行fun2(),一切都很好。为什么?指针的副本仍指向同一件事吗?那为什么fun1()不起作用?

int *x = NULL;
    auto fun1 = [x]() mutable
    {
        x = new int(5);
    };
    auto fun2 = [&x]()
    {
        x = new int(5);
    };

2 个答案:

答案 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值,就像你可以按价值将它传递给一个函数。