|  | 
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(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 ASIO_DISABLE_MOVE, or explicitly enabled
          for other compilers by defining ASIO_HAS_MOVE.
          Note that these macros also affect the availability of movable
          I/O objects.