Почему эта программа использует boost::ref

Библиотека Ref - это небольшая библиотека, которая полезна для передачи ссылок на шаблоны функций (алгоритмы), которые обычно принимают копии своих аргументов.

от http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_server.cpp

в вызов доставить -

  void deliver(const chat_message& msg)
  {
    recent_msgs_.push_back(msg);
    while (recent_msgs_.size() > max_recent_msgs)
      recent_msgs_.pop_front();

    std::for_each(participants_.begin(), participants_.end(),
        boost::bind(&chat_participant::deliver, _1, boost::ref(msg)));
  }

если

void deliver(const chat_message& msg)

в другом классе сообщение принимается по ссылке, тогда почему boost::ref вообще используется?

2 ответа

Решение

boost::bind делает копию своих входов, так что если boost::ref в этом случае не используется копия chat_message будет сделано. Таким образом, кажется, что авторы кода хотят избежать этой копии (за счет boost::ref объект или два). Это может иметь смысл, если chat_message большой или дорогой для копирования. Но было бы более разумно использовать boost::cref, поскольку оригинал передается по константной ссылке, и вызов не должен изменять переданное сообщение.

Примечание: вышесказанное относится к std::bind а также std::tr1::bind,

Аргументы, которые принимает bind, копируются и хранятся внутри возвращенного функционального объекта. Например, в следующем коде:

int i = 5;

bind (f, i, _1); копия значения i сохраняется в объекте функции. boost:: ref и boost:: cref могут быть использованы для того, чтобы объект функции сохранял ссылку на объект, а не на копию:

от http://www.boost.org/doc/libs/1_53_0/libs/bind/bind.html

Другие вопросы по тегам