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

Roh*_*hit 3 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);
}
Run Code Online (Sandbox Code Playgroud)

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

boost ref究竟在哪里有用?

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

Mik*_*our 14

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

他们不会.这不是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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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