2013-05-29 4 views
3

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

из 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) 

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

ответ

5

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

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

+1

http://stackoverflow.com/questions/6397092/boostbind-копии по ссылке или по значению –

0

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

int i = 5;

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^