2016-04-27 18 views
6

コンパイラが第4のものに不満を表明している間に、ラムダの引数型がstd::function型と異なる場合でも、なぜ3番目のケースが問題ないのか分かりません:std :: functionと異なるシグネチャを持つLambda関数

function<int(int)> idInt = [](int i) {return i;}; //OK 
function<int(int&)> idInt = [](int &i) {return i;}; //OK 
function<int(int&)> idInt = [](int i) {return i;}; //OK 
function<int(int)> idInt = [](int &i) {return i;}; //ERROR! 
+5

ので左辺値から右値への変換があります(いわゆる「左辺値 - 右辺値変換」)が、右辺値から左辺値への変換はありません。 'std :: function'のコンストラクタは宣言されたシグネチャを気にせず、暗黙の*コール式*が有効かどうかについてのみ気にします。 –

+2

なぜ 'auto'を使わないのですか? 'auto idInt = ...' – ZDF

答えて

8

あなたが書いた:

function<int(int)> idInt = [](int &i) {return i;}; //ERROR! 

あなたはidIntint引数で呼び出すことができる機能、閉鎖、...を包むことができると言います。

auto fn = [](int &i) {return i;}; 
fn(1); // error - you try to bind temporary to reference 

あなたは右辺値参照やconstの&を使用するように署名を変更することにより、それを修正することができます:あなたはここのような整数リテラルとそれを呼び出すことはできませんので、しかし、これは、[](int &i) {return i;};の場合には当てはまりません

std::function<int(int)> idInt1 = [](int &&i) {return i;}; 
std::function<int(int)> idInt2 = [](const int &i) {return i;}; 
関連する問題