Lambda 不以值来捕获 *this

2021-06-24  本文已影响0人  fck_13

如果类的非静态成员函数中的lambda表达式想要访问 this指针,有以下形式

class ExampleClass
{
public:
  void func()
  {
    auto CaptureThisByReference = [&](){ value = 1;} // Equal to (*this).value = 1;
    auto CaptureThisByValue = [=](){ value = 2;}     // Equal to (*this).value = 2;
    CaptureThisByReference();
    CaptureThisByValue();
  }

private:
  int value;
};

也就是说,我们在lambda表达式中存储了一个指针。
考虑下面这种情况

class ExampleClass
{
public:
  auto func()
  {
    auto CaptureThisByValue = [=](){ value = 2;}     // Equal to (*this).value = 2;
    return CaptureThisByValue;
  }

private:
  int value; 
}

std::function<void()> myFunction; 
{
  ExampleClass obj;
  myFunction = obj.func();
}

myFunction(); //can not work, becase obj has been destroyed

p0018 给出的解决方案是使用*this*this表示以值来捕获当前this指针指向的对象,相当于在lambda中存储了整个对象,而不是简单的指针。

上一篇 下一篇

猜你喜欢

热点阅读