Когда поддержка движения доступна (через ссылки на значение r), увеличить. Asio позволяет перемещать конструкцию и назначение гнезд, последовательных портов, дескрипторов POSIX и ручек Windows.
Поддержка перемещения позволяет писать код, например:
tcp::socket make_socket(io_service& i)
{
  tcp::socket s(i);
  ...
  std::move(s);
}
или:
class connection : public enable_shared_from_this<connection>
{
private:
  tcp::socket socket_;
  ...
public:
  connection(tcp::socket&& s) : socket_(std::move(s)) {}
  ...
};
...
class server
{
private:
  tcp::acceptor acceptor_;
  tcp::socket socket_;
  ...
  void handle_accept(error_code ec)
  {
    if (!ec)
      std::make_shared<connection>(std::move(socket_))->go();
    acceptor_.async_accept(socket_, ...);
  }
  ...
};
а также:
std::vector<tcp::socket> sockets;
sockets.push_back(tcp::socket(...));
Предупреждающее слово: Ничто не мешает вам перемещать эти объекты, пока ожидаются асинхронные операции, но вряд ли это будет хорошей идеей. В частности, составные операции, такие какasync_read()сохранить ссылку на объект потока. Перемещение во время составленной операции означает, что составленная операция может попытаться получить доступ к перемещенному объекту.
Поддержка перемещения автоматически включается для<g++>4.5 и позже, когда используются опции компилятора<-std=c++0x>или<-std=gnu++0x>. Он может быть отключен путем определения<BOOST_ASIO_DISABLE_MOVE>или явно включен для других компиляторов путем определения<BOOST_ASIO_HAS_MOVE>. Обратите внимание, что эти макросы также влияют на доступностьподвижных обработчиков..