移动语义句柄
作为一个最优解,用户自定义的结束回调(句柄)应该自定义移动构造函数,这样Asio在调用时会使用它的移动构造函数而非拷贝构造函数。特定情况下,Asio会尽量避免调用句柄的拷贝构造。然而,句柄类型依然需要实现拷贝构造。
当移动语义是可用的,异步行为表面上是这样的:
template <typename Handler>
void async_XYZ(..., Handler handler);
实际上它们是这样声明的:
template <typename Handler>
void async_XYZ(..., Handler handler);
handler参数被完美传递了,而且移动构造也发生在函数块内。这样保证了所有的函数调用都会优先使用移动语义。当async_XYZ()的另一个参数是handler的成员时,这点就变得至关重要了。
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(asio::buffer(*buffer), std::move(*this));
...
}
}