std::bind 不适用于引用?

std::bind doesn't work with reference?

本文关键字:引用 适用于 不适用 bind std      更新时间:2023-10-16

我有以下程序,它可以工作:

#include<iostream>
#include<functional>
using namespace std;
using namespace std::placeholders;
void f(int i,int j){
++i;
++j;
}
int main(){
int i=0;
int j=0;
bind(&f,_1,i)(3);
bind(&f,j,_1)(4);
return 0;
}

但是如果我更改 f 以接收引用,并将 ref(( 添加到绑定:

#include<iostream>
#include<functional>
using namespace std;
using namespace std::placeholders;
void f(int &i,int &j){
++i;
++j;
}
int main(){
int i=0;
int j=0;
bind(&f,_1,ref(i))(3);
bind(&f,ref(j),_1)(4);
return 0;
}

好吧,它无法编译:

clang --std=c++11 给出以下错误:

no matching function for call to object of type '__bind<void (*)(int &,
int &), std::__1::placeholders::__ph<1> &, int &>'
bind(&f,_1,i)();

如何解决?

bind(&f, _1, ref(i))(3);
bind(&f, ref(j), _1)(4);

一般来说,它与调用是一回事:

f(3, i);
f(j, 4);

其中函数f定义为:

void f(int &i, int &j) {
++i;
++j;
}

但是你不能将非常量左值引用(如int &i(绑定到右值(如3(,这就是编译器抱怨的原因。