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

时间:2016-01-11 10:30:47

标签: c++ c++11 boost lambda boost-asio

在Boost.asio C ++ 11示例中,有一些代码段like the following

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 question),但我不明白为什么this指针也是 do_write(length)代替self->do_write(length)还是有其他原因?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

那里给出的答案是绝对错误!你不应该同时通过!根据您的代码,您应该如何执行此操作,而不会传递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); } }); }

std::bind

实际上,你应该使用ff 15 76 0b 20 00 callq *0x200b76(%rip) # 600ff0 <__libc_start_main@GLIBC_2.2.5> ,而不是lambdas。这将使您的代码更紧凑。