下面是一些代码from a boost::asio example .为什么在构建 chat_session
时 move socket_
成员是可以的,如果处理程序底部的递归调用将处理相同的 tcp::socket
下次接受时输出?我认为在 move 操作之后,对象不再可以安全使用。
class chat_server
{
public:
chat_server(boost::asio::io_service& io_service,
const tcp::endpoint& endpoint)
: acceptor_(io_service, endpoint),
socket_(io_service)
{
do_accept();
}
private:
void do_accept()
{
acceptor_.async_accept(socket_,
[this](boost::system::error_code ec)
{
if (!ec)
{
std::make_shared<chat_session>(std::move(socket_), room_)->start();
}
do_accept();
});
}
tcp::acceptor acceptor_;
tcp::socket socket_;
chat_room room_;
};
最佳答案
这段代码相当于做了下面的事情:
some_class o;
while ( true )
{
// assign a new instance of some_class to the o variable, calling o.bar() is valid
o = some_class(...);
foo(std::move(o));
// o is no longer valid calling o.bar() would fail
}
调用 async_accept
将套接字重新初始化为可以使用的有效值。 move 的对象处于未指定(但有效)状态,由该对象的实现者决定该状态是什么。在 asio::tcp::socket
的情况下,状态是一个未初始化的套接字,可用于新连接。
关于c++ - 为什么这个boost::asio::tcp::socket可以重复使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51617810/