boost :: ref和常规引用之间的区别

时间:2010-04-01 14:37:09

标签: c++ boost reference

boost::ref(i)& i之间有什么区别?我们不能使用常规引用而必须转而使用boost::ref的情况是什么?如果可能,请提供示例。

2 个答案:

答案 0 :(得分:7)

来自Boost.Ref Documentation

  

目的   boost :: reference_wrapper是   包含对象的引用   类型T.它主要用于“喂”   对函数模板的引用   (算法)采取他们的参数   按价值。

注意:boost::reference_wrapperstd::reference_wrapper(至少是Boost 1.52)之间的一个重要区别是std::reference_wrapper能够完美地包装函数对象。

这样可以启用以下代码:

// functor that counts how often it was applied
struct counting_plus {
  counting_plus() : applications(0) {}
  int applications;

  int operator()(const int& x, const int& y) 
  { ++applications; return x + y; }
};

std::vector<int> x = {1, 2, 3}, y = {1, 2, 3}, result;
counting_plus f;
std::transform(begin(x), end(x), begin(y), 
               std::back_inserter(result), std::ref(f));
std::cout << "counting_plus has been applied " << f.applications 
          << " times." << '\n';

答案 1 :(得分:4)

例如在Boost.Thread中:

  

通过传递一个新线程   可调用类型的对象   没有参数调用   构造函数。然后复制该对象   进入内部存储,并调用   新创建的执行线程。   如果对象不能(或不能)   复制,然后 boost :: ref 可用于   传递对函数的引用   宾语。在这种情况下,用户   Boost.Thread必须确保   被提及的对象超过了   新创建的执行线程。

来自doc的代码:

struct callable
{
    void operator()();
};

boost::thread copies_are_safe()
{
    callable x;
    return boost::thread(x);
} // x is destroyed, but the newly-created thread has a copy, so this is OK

boost::thread oops()
{
    callable x;
    return boost::thread(boost::ref(x));
} // x is destroyed, but the newly-created thread still has a reference
  // this leads to undefined behaviour