【问题标题】:c++ Assign pointer value inside lambda by value or referencec ++通过值或引用在lambda内分配指针值
【发布时间】:2014-10-16 03:20:29
【问题描述】:

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

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

【问题讨论】:

  • 复制的第一个捕获
  • 这与 lambdas 无关。尝试使用普通的旧函数并查看。
  • 那么为什么指针的副本不指向同一个东西呢?
  • 因为它是指针的本地副本。

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


【解决方案1】:
auto fun1 = [x]() mutable { ... }

通过复制捕获x,因此它会修改x 的副本。当 lamdba 返回时,您的x 仍未分配。

auto fun2 = [&x]() { ... }

通过引用捕获x,因此您确实是在修改x。

这与 lambdas 无关:常规函数存在相同的行为(see value and reference semantics entry in the C++ FAQ)

【讨论】:

    【解决方案2】:

    我认为用户在这里会感到困惑,因为它是一个指针,但指针也是变量,也可以通过值或引用传递。

    这里是x 本身,而不是x 指出的关键点。您需要修改指针,而不是它指向的位置。因此,您必须通过引用将其传递给 lambda。

    如果您真正感兴趣的是*x,并且x 本身不会被修改(指向其他地方),那么您只需将其按值传递给 lambda,就像您通过它按值传递给函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多