在c ++ lambdas中捕获内部构造函数的类成员

时间:2018-02-08 11:40:57

标签: c++ lambda

假设我们有A级:

class A
{
    double x;
    double y;
    A(double, double);
    function <double(void)> F;
};

以下构造函数:

A::A(double a, double b)
{
    x = a;
    y = b;
    F = [this]() { return x + y; };
}

为什么上述构造函数在下面的构造函数导致编译错误时起作用:member A::x is not a variable? (y的错误相同。)

A::A(double a, double b)
{
    x = a;
    y = b;
    F = [x,y]() { return x + y; };
}

似乎我只能捕获this而不是类成员。那是为什么?

1 个答案:

答案 0 :(得分:9)

来自cppreference – Lambda expressions

  

没有初始值设定项的捕获无法显式捕获类成员(如上所述,捕获列表中只允许使用变量):

class S {
  int x = 0;
  void f() {
    int i = 0;
//  auto l1 = [i, x]{ use(i, x); };    // error: x is not a variable
    auto l2 = [i, x=x]{ use(i, x); };  // OK, copy capture
    i = 1; x = 1; l2(); // calls use(0,0)
    auto l3 = [i, &x=x]{ use(i, x); }; // OK, reference capture
    i = 2; x = 2; l3(); // calls use(1,2)
  }
};