2017-07-27 43 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),這就是編譯器抱怨的原因。

相關問題