Non capisco il motivo per cui il terzo caso è ok (anche se del tipo lambda argomenti è diverso dal tipo std::function
sono), mentre il compilatore si lamenta con la quarta:funzione lambda con diverse firme di std :: funzione
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!
Perché esiste una conversione da lvalue a rvalue (la cosiddetta "conversione da lvalue a rvalue"), ma non vi è alcuna conversione da rvalue a lvalue. I costruttori di 'std :: function' non si preoccupano delle firme dichiarate, ma solo se l'espressione * call * implicita è valida. –
Perché non utilizzare 'auto'? 'auto idInt = ...' – ZDF