Почему эта программа использует 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 могут быть использованы для того, чтобы объект функции сохранял ссылку на объект, а не на копию: