我对使用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进行任何更改)
答案 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}}对迭代器引用进行操作,避免复制(尽管迭代器通常是廉价复制值类型),但我还没有尝试过。如果你认为它会对你有所帮助,为什么不试试呢?