移动语义句柄

作为一个最优解,用户自定义的结束回调(句柄)应该自定义移动构造函数,这样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));
        ...
    }
}

results matching ""

    No results matching ""