В качестве оптимизации определяемые пользователем обработчики завершения могут предоставлять конструкторы ходов и Boost. В реализации Asio будет использоваться конструктор движений обработчика, а не его конструктор копий. В определённых обстоятельствах — рост. Asio может быть в состоянии устранить все вызовы к конструктору копий обработчика. Тем не менее, типы обработчиков по-прежнему должны быть копируемыми.
Когда включена поддержка движения, асинхронные, которые документируются следующим образом:
template <typename Handler>
void async_XYZ(..., Handler handler);
фактически они объявлены как:
template <typename Handler>
void async_XYZ(..., Handler&& handler);
Аргумент обработчика идеально перенаправляется, и конструкция перемещения происходит в теле async_XYZ()
. Это гарантирует, что все другие аргументы функции будут оценены до переезда. Это имеет решающее значение, когда другие аргументы async_XYZ()
являются членами обработчика. Например:
struct my_operation
{
shared_ptr<tcp::socket> socket;
shared_ptr<vector<char>> buffer;
...
void operator(error_code ec, size_t length)
{
...
socket->async_read_some(boost::asio::buffer(*buffer), std::move(*this));
...
}
};
Поддержка перемещения автоматически включается для g++
4.5 и позже, когда используются параметры компилятора -std=c++0x
или -std=gnu++0x
. Он может быть отключен путем определения BOOST_ASIO_DISABLE_MOVE
или явно включен для других компиляторов путем определения BOOST_ASIO_HAS_MOVE
. Обратите внимание, что эти макросы также влияют на доступность подвижных объектов ввода/вывода .