【问题标题】:Is there any difference betwen [=] and [&] in lambda functions?lambda 函数中的 [=] 和 [&] 有什么区别吗?
【发布时间】:2014-01-14 02:42:36
【问题描述】:

我最近在学习 c++11 中的 lambda 函数。但是不知道[=][&]有什么区别。如果有,有什么区别?

而在这两种情况下,lambda body 中的this 有什么区别吗?

【问题讨论】:

    标签: c++ c++11 lambda


    【解决方案1】:

    不同之处在于捕获值的方式

    • & 通过引用捕获
    • = 按值捕获

    快速示例

    int x = 1;
    auto valueLambda = [=]() { cout << x << endl; };
    auto refLambda = [&]() { cout << x << endl; };
    x = 13;
    valueLambda();
    refLambda();
    

    这段代码会打印出来

    1
    13
    

    第一个 lambda 在定义 valueLambda 时按值捕获 x。因此它得到1 的当前值。但是refLambda 捕获了对本地的引用,因此它可以看到最新的值

    【讨论】:

    • 谢谢。我的第二个问题呢?如果lambda函数在一个类中,lambda body中的this有什么区别吗?
    • @pktangyue 它不会影响this 的捕获,因为this 总是按值捕获
    • @JaredPar 我不明白为什么 valueLambda() 打印 1 尽管它按值捕获,在调用 valueLambda 之前 x 的值更改为 13?
    • @gaurav valueLambda() 在定义 valueLambda() 时捕获 x 的值,而不是在调用它时。 x = 13;在 valueLambda() 的定义之后。
    【解决方案2】:
    • & 表示“通过引用捕获”。
    • = 表示“按值捕获”。

    我在这里回复是因为我想指出一件事:

    this 指针始终按值捕获。在 C++11 中,这意味着,如果要捕获类中变量的副本,例如 this-&gt;a,在实践中总是会通过引用来捕获它。为什么?

    考虑:

    [this]() { ++this->a; }
    

    this是按值捕获的,但是这是一个指针,所以a是通过this引用的。

    如果您想要一个成员变量的副本,在 C++11 中,请执行以下操作:

    auto copy = this->a;
    [copy]() mutable { ++copy; }
    

    请注意这个警告,因为在您想到它之前它并不直观。

    【讨论】:

    • 另外,如果要修改 lambda 中的副本,则必须将其指定为可变: [copy]() mutable { ++copy; }
    【解决方案3】:

    JaredPar 已经回答了第一个问题。

    对于您的第二个问题,lambda 主体中的 this 与其包含类的 this 相同。以下示例来自标准。

    struct S1 {
      int x, y;
      int operator()(int);
      void f() {
        [=]()->int {
          return operator()(this->x + y); 
          // equivalent to S1::operator()(this->x + (*this).y)
          // this has type S1*
        };
      }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 2012-08-29
      • 1970-01-01
      • 2021-02-12
      • 2019-01-15
      相关资源
      最近更新 更多