2017-07-27 13 views
0

私はプログラム以下の持っている、それは動作します:私は(参照を受け取り、とrefを追加するために、Fを変更した場合に結合する)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; 
} 

しかし:まあ、コンパイルに失敗し

#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

使用ラムダ。少なくとも-std = C++ 14を使用してください! –

+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は次のように定義されて
f(3, i); 
f(j, 4); 

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

しかし、あなたは非const左辺値参照をバインドすることはできません (のようなint &i右辺値へ(のような)、それがコンパイラが不平を言う理由です。代わりに、バインドの

関連する問題