在boost async-tcp-echo-server示例中,有一个服务器类可以在新连接上创建会话:
acceptor.async_accept(socket, [this](boost::system::error_code ec) {
if (!ec)
std::make_shared<session>(std::move(socket))->start();
do_accept();
});
session::start()
功能正文:
void start() { do_read(); }
session::do_read
方法是私有成员函数:
void do_read()
{
auto self(shared_from_this());
socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
[this, self](boost::system::error_code ec, std::size_t length) {
if (!ec)
do_write(length);
});
}
如果我错了,请纠正我
会话类继承自std::enable_shared_from_this
,因此在调用shared_from_this()
时已经创建了一个控制块,并且不会发生任何未定义的行为。在do_read
函数中shared_from_this()
函数用于允许在仍存在于内存中的对象上调用do_write()
方法。如果不使用shared_from_this()
,则在到达范围结束时可以删除该对象。
为什么在lambda表达式中捕获this
?
是do_write()
还是this
调用self
方法?
在C ++ 14中我可以替换:
auto self(shared_from_this());
socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
[this, self] ...
with:
socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
[this, shared_from_this()] ...
? 或者甚至是这样:
socket.async_read_some(boost::asio::buffer(data, sizeof(data)),
[self = shared_from_this()](boost::system::error_code ec, std::size_t length) {
if (!ec)
self->do_write(length);
});
答案 0 :(得分:4)
self
对象作为所有权令牌被捕获到lambda中:只要lambda存在,令牌就会存在,并且对象不会被销毁。
捕获this
在这里是多余的,但没有它就必须写
if (!ec)
self->do_write(length);
而不是
if (!ec)
do_write(length);
与
相同if (!ec)
this->do_write(length);
因此,this
主要是为了便于阅读。