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?
答案 0 :(得分:5)
boost::bind
会复制其输入,因此如果在这种情况下不使用boost::ref
,则会生成chat_message
的副本。因此,代码的作者似乎想要避免该副本(以实例化一个或两个boost::ref
对象为代价)。如果chat_message
大或复制昂贵,这可能有意义。但是使用boost::cref
更有意义,因为原始文件是由const引用传递的,并且调用不应该修改传递的消息。
注意:以上内容适用于std::bind
和std::tr1::bind
。
答案 1 :(得分:0)
绑定的参数由内部复制和保存 返回的函数对象。例如,在以下代码中:
int i = 5;
bind(f,i,_1); i的值的副本存储在函数中 宾语。 boost :: ref和boost :: cref可用于制作函数 object存储对象的引用,而不是副本: