c++ - 为什么这个boost::asio::tcp::socket可以重复使用?

标签 c++ c++11 boost boost-asio move-semantics

下面是一些代码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/

相关文章:

c++ - 错误 : expected primary-expression before ')' token

c++ - 非 POD 数组上的 std::fill_n 是否可以首次初始化?

c++ - range-for 表达式中的临时生命周期

c++ - 如何在编译时检查两种类型是否相同(如果它与 Boost strong typedef 一起使用则加分)

boost::计算流压缩

c++ - 在共享内存中的 boost 图中插入 boost vector

c++ - 捆绑动态库 : keep looking in the usr/local/lib

c++ - 'if' 带有模板参数或 SFINAE 是首选?

c++ - 如何使用boost weibull分布库进行随机数生成?

c++ - 他们为什么不添加 iota 的运营商版本?