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

3

Решение

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

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

5

Другие решения

Аргументы, которые принимает 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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector