Lambda 不以值来捕获 *this

如果类的非静态成员函数中的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中存储了整个对象,而不是简单的指针。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容