为什么这个程序使用boost :: ref

时间:2013-05-29 07:07:32

标签: c++ const pass-by-reference pass-by-value 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 个答案:

答案 0 :(得分:5)

boost::bind会复制其输入,因此如果在这种情况下不使用boost::ref,则会生成chat_message的副本。因此,代码的作者似乎想要避免该副本(以实例化一个或两个boost::ref对象为代价)。如果chat_message大或复制昂贵,这可能有意义。但是使用boost::cref更有意义,因为原始文件是由const引用传递的,并且调用不应该修改传递的消息。

注意:以上内容适用于std::bindstd::tr1::bind

答案 1 :(得分:0)

  

绑定的参数由内部复制和保存   返回的函数对象。例如,在以下代码中:

     

int i = 5;

     

bind(f,i,_1); i的值的副本存储在函数中   宾语。 boost :: ref和boost :: cref可用于制作函数   object存储对象的引用,而不是副本:

来自http://www.boost.org/doc/libs/1_53_0/libs/bind/bind.html