Когда поддержка движения доступна (через ссылки на значение 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
>. Обратите внимание, что эти макросы также влияют на доступностьподвижных обработчиков..