有人可以解释ref()vs&c ++ 11以及何时使用每个?

jte*_*erm 1 c++ reference std c++11

我阅读了有关它的文档,但如果有人能用更简单的英语解释它,我会很感激.

Max*_*kin 5

普通C++引用&是一个奇怪的公民,因为它可以初始化但不能重新分配.例如:

int a, &ra = a;
int b, &rb = b;
ra = rb; // actually does a = b
Run Code Online (Sandbox Code Playgroud)

普通指针是一个表现良好的公民,它可以被初始化和重新分配.

因此ref()创建reference_wrapper了一个普通指针的包装器.这个包装器可以用引用初始化,它有一个自动转换为普通引用&,例如:

int a;
auto ra = std::ref(a); 
int b;
auto rb = std::ref(b);
ra = rb; // now ra contains a pointer to b
int& rb2 = ra; // automatically converts to reference
Run Code Online (Sandbox Code Playgroud)

它主要用于使用lambdas或std::bind表达式的函数式编程.std::bind复制绑定参数,所以如果你想将一个函数参数绑定到一个引用reference_wrapper就派上用场了.例如:

void foo(int);

int i = 1;
auto f = std::bind(foo, i); // makes a copy of i
i = 2;
f(); // calls foo(1)

auto g = std::bind(foo, std::ref(i));
i = 3;
g(); // calls foo(3);
Run Code Online (Sandbox Code Playgroud)