Как обмануть boost :: asio, чтобы разрешить обработчики только для перемещения

В протоколе связи RPC после вызова метода I 'м отправкасделанный" сообщения обратно звонящему. Поскольку методы вызываются одновременно, буфер, содержащий ответ (std::string) должен быть защищен мьютексом. Что я'Я пытаюсь достичь следующего:

void connection::send_response()
{
    // block until previous response is sent
    std::unique_lock locker(response_mutex_);

    // prepare response
    response_ = "foo";

    // send response back to caller. move the unique_lock into the binder
    // to keep the mutex locked until asio is done sending.
    asio::async_write(stream_,
                      asio::const_buffers_1(response_.data(), response_.size()),
                      std::bind(&connection::response_sent, shared_from_this(),
                                _1, _2, std::move(locker))
                      );
}

void connection::response_sent(const boost::system::error_code& err, std::size_t len)
{
    if (err) handle_error(err);
    // the mutex is unlocked when the binder is destroyed
}

Однако это не компилируется, так какboost::asio требуетобработчики должны быть CopyConstructible.

Эту проблему можно обойти (хотя и не очень элегантно), используя вместо этого следующий общий класс locker:unique_lock

template 
class shared_lock
{
public:
    shared_lock(Mutex& m)
    : p_(&m, std::mem_fn(&Mutex::unlock))
    { m.lock(); }

private:
    std::shared_ptr p_;
};

В чем причинаboost::asio не разрешать обработчики только для перемещения?

Ответы на вопрос(2)

Ваш ответ на вопрос