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