![]() |
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.