2017-07-27 45 views
0

我有下面的程序和它的作品:std :: bind不能用于引用?

#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; 
} 

那么它不能通过编译:

铛--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)(); 

如何解决它?

+0

使用lambda代替bind。至少使用-std = C++ 14! – 2017-07-27 08:41:07

+3

'f(i,4)'也是一个错误。 – molbdnilo

+0

std :: ref不创建引用,它创建一个reference_wrapper。 – xaxxon

回答

1
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; 
} 

但你不能绑定非const左值参考 (如int &i)至右值(如3),这就是编译器抱怨的原因。

相关问题