使用boost :: ref传递对带值的函数的引用

时间:2013-05-09 11:36:51

标签: c++ boost boost-ref

我对使用boost :: ref感到困惑。我不明白为什么任何人想要做以下事情 -

void f(int x)
{
    cout << x<<endl;
    x++;
}

int main(int argc, char *argv[])
{
    int aaa=2;
    f(boost::ref(aaa));
    cout << aaa<<endl;
    exit(0);
}

将ref传递给函数有什么用?我总是可以通过价值来代替。也不是说裁判实际上是通过了。在上面,主要的aaa值仅为2。

boost ref究竟有用吗?

在这种情况下是否可以使用boost :: ref。 我想传递iterator引用std :: sort函数。通常这个排序适用于迭代器副本 - boost :: ref是否也适用于引用? (没有对std :: sort进行任何更改)

2 个答案:

答案 0 :(得分:13)

  

我不明白为什么有人想要做以下事情

他们不会。这不是boost::ref(或这些日std::ref)的用途。如果函数按值获取参数,则无法强制它通过引用来获取它。

  

boost ref究竟有用吗?

它可以用来使函数模板通过引用获取参数,通过实例化参考(包装器)类型的模板,而不是值类型:

template <typename T>
void f(T x) {++x;}

f(aaa);      cout << aaa << endl; // increments a copy: prints 0
f(ref(aaa)); cout << aaa << endl; // increments "a" itself: prints 1

一个常见的特定用途是绑定函数的参数:

void f(int & x) {++x;}

int aaa = 0;
auto byval = bind(f, aaa);      // binds a copy
auto byref = bind(f, ref(aaa)); // binds a reference

byval(); cout << aaa << endl;   // increments a copy: prints 0
byref(); cout << aaa << endl;   // increments "a" itself: prints 1
  

在这种情况下是否可以使用boost:; ref。我想传递iterator引用std :: sort函数。通常这个排序适用于迭代器副本 - boost :: ref是否也适用于引用?

没有;引用包装器不符合迭代器要求,因此您无法在标准算法中使用它。如果可以的话,如果他们需要制作迭代器的独立副本(许多人,包括大多数sort实现必须这样做),那么许多算法都会出现可怕的错误。

答案 1 :(得分:-2)

您是否阅读了documentation

它说:

  

Ref库是一个小型库,可用于传递对函数模板(算法)的引用,这些函数通常会复制其参数。

在您的第一个示例中,void f(int)不是函数模板,因此没有效果:创建匿名临时boost::reference_wrapper<int>并立即转换回int&,然后int取消引用以将std::sort传递给您的函数。希望编译器会丢弃所有这些废话,因为它没有效果。

你说:

  

......我总是可以通过价值来传递。

这是真的,但他们做了不同的事情。通过引用传递:

  • 避免复制,这对于整数来说可能毫无意义,但对于大型或昂贵的复制对象非常有用
  • 允许调用者使用其参数查看被调用函数所做的。这对std::sort不太可能有用,但通常允许输入输出参数可能很有用

可以允许{{1}}对迭代器引用进行操作,避免复制(尽管迭代器通常是廉价复制值类型),但我还没有尝试过。如果你认为它会对你有所帮助,为什么不试试呢?