在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)
还是有其他原因?
答案 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。这将使您的代码更紧凑。