为什么要在lambdas中捕获这个以及指向这个的共享指针

Why capture this as well as shared-pointer-to-this in lambdas?

本文关键字:指针 共享 lambdas 为什么      更新时间:2023-10-16

在Boost.asio C++11示例中,有如下片段:

void do_read()
{
  auto self(shared_from_this());
  socket_.async_read_some(boost::asio::buffer(data_, max_length),
      [this, self](boost::system::error_code ec, std::size_t length)
      {
        if (!ec)
        {
          do_write(length);
        }
      });
}

我理解为什么需要self指针来保持类的活动(请参阅此问题),但我不理解为什么this指针也被捕获。这只是为了让作者写do_write(length)而不是self->do_write(length),还是另有原因?

如果未捕获this,则无法从lambda内部调用类的方法(例如do_write)。或访问成员变量。当然,您可以改为编写self->do_write(),但它既不那么优雅,也可能更慢(因为涉及到shared_ptr)。

那里给出的答案是绝对错误!你不应该两个都通过!以下是您应该如何在不通过this:的情况下,根据您的代码进行操作

void do_read()
{
  auto self(shared_from_this());
  socket_.async_read_some(boost::asio::buffer(data_, max_length),
      [self](boost::system::error_code ec, std::size_t length)
      {
        if (!ec)
        {
          self->do_write(length);
        }
      });
}