班级成员在C Lambdas中捕获内部构造函数

Class members capturing inside constructor in c++ lambdas

本文关键字:内部 构造函数 Lambdas 成员      更新时间:2023-10-16

说我们有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,而不是类成员。为什么?

来自cppreference - lambda表达式:

类成员不能在没有初始化器的情况下通过捕获明确捕获(如上所述,捕获列表中仅允许变量(:

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)
  }
};