почему эта программа использует 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?


person Community    schedule 29.05.2013    source источник


Ответы (2)


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

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

person juanchopanza    schedule 29.05.2013
comment

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

интервал я = 5;

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

из http://www.boost.org/doc/libs/1_53_0/libs/bind/bind.html

person Community    schedule 29.05.2013