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

dsh*_*erd 15 c++ lambda boost boost-asio c++11

在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);
        }
      });
}
Run Code Online (Sandbox Code Playgroud)

我理解为什么self需要指针来保持类活着(请参阅此问题),但我不明白为什么this指针被捕获.只是这样作者可以写do_write(length)而不是self->do_write(length)或有其他原因吗?

Vio*_*ffe 5

如果没有this捕获,则无法从lambda内部调用类的方法(例如do_write)。或访问成员变量。当然,您可以编写self->do_write(),但是它不那么优雅,而且可能更慢(由于shared_ptr涉及)。