美文网首页
Lambda 不以值来捕获 *this

Lambda 不以值来捕获 *this

作者: fck_13 | 来源:发表于2021-06-24 00:09 被阅读0次

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

相关文章

  • Lambda 不以值来捕获 *this

    如果类的非静态成员函数中的lambda表达式想要访问 this指针,有以下形式 也就是说,我们在lambda表达式...

  • 关于lambda表达式

    基本语法就不谈了。 值捕获 值捕获就相当于在创建lambda对象时复制了一份所捕获的变量; 如果以传值的形式捕获外...

  • C++ lambda和function

    lambda表达式 lambda表达式又称为匿名表达式,是C11提出的新语法。[]存储lambda表达式要捕获的值...

  • C++ lambda表达式

    lambda表达式 目录 一、开篇 二、lambda初识 三、lambda基本用法 四、lambda表达式捕获列表...

  • C++14/17新特性

    c++14 函数返回类型auto lambda参数auto lambda捕获参数初始化 [[deprecated]...

  • Java lambda表达式学习文档 冲~

    Java lambda表达式的基础知识包括:lambda表达式的定义、lambda与匱名内部类、变量捕获、函数式接...

  • C++11之lambda

    lambda函数的语法如下: [] capture list 捕获列表,定义了lambda函数如何引用上下文中既有...

  • ★11.关于lambda

    捕获示例 mutable 代码 输出结果 注意事项 不要用引用捕获局部变量。 lambda不需要捕获静态变量就可以...

  • Python3 - 匿名函数捕获参数值

    问题 用lambda定义了一个匿名函数,想在定义时捕获到某些变量的值。 解决方案 先看下面代码的效果: 猜想一下:...

  • 关于block对于变量捕获的探究

    首先,大家都知道,block对于局部变量,是值捕获,而不是指针捕获,这里用可变类型来验证一下,block所谓的值捕...

网友评论

      本文标题:Lambda 不以值来捕获 *this

      本文链接:https://www.haomeiwen.com/subject/tuwiyltx.html