|  | Home | Libraries | People | FAQ | More | 
With C++11 and later, user-defined completion handlers are only required to be move constructible, and are not required to be copy constructible.
When move support is enabled, asynchronous that are documented as follows:
template <typename Handler> void async_XYZ(..., Handler handler);
are actually declared as:
template <typename Handler> void async_XYZ(..., Handler&& handler);
          The handler argument is perfectly forwarded and the move construction occurs
          within the body of async_XYZ(). This ensures that all other
          function arguments are evaluated prior to the move. This is critical when
          the other arguments to async_XYZ() are members of the handler.
          For example:
        
struct my_operation
{
  unique_ptr<tcp::socket> socket;
  unique_ptr<vector<char>> buffer;
  ...
  void operator(error_code ec, size_t length)
  {
    ...
    socket->async_read_some(boost::asio::buffer(*buffer), std::move(*this));
    ...
  }
};
          Move support is automatically enabled for g++ 4.5 and
          later, when the -std=c++0x or -std=gnu++0x
          compiler options are used. It may be disabled by defining BOOST_ASIO_DISABLE_MOVE,
          or explicitly enabled for other compilers by defining BOOST_ASIO_HAS_MOVE.
          Note that these macros also affect the availability of movable
          I/O objects.