std::bind 的功能是将一个函数和它的参数预先绑定在一起,变成一个无参函数。
std::bind 总是拷贝其参数,但是调用者可以使用std::ref来实现传递引用给std::bind。
std::ref 返回一个 reference_wrapper 类型的变量,关于 std::ref 及 reference_wrapper 的具体实现可以参照 c++ <functional> 文件。
一个例子说明std::ref的使用方法:
#include <iostream>
#include <functional>
void test_fun(int& a, int& b, int c) {
a++;
b++;
c++;
}
int main() {
int a = 1, b = 1, c = 1;
auto fun = std::bind(test_fun, a, std::ref(b), std::ref(c));
fun();
std::cout << "a:" << a << " b:" << b << " c:" << c << std::endl;
return 0;
}
以上程序的运行结果为:
a:1 b:2 c:1
由此可以得到以下结论:
a std::bind总是使用值拷贝的形式传参,哪怕函数声明为引用
b std::bind可以使用std::ref来传引用
c std::bind虽然使用了std::ref传递了引用,如果函数本身只接受值类型参数,传递的仍然是值而不是引用。