6
我不明白爲什麼第三種情況是好的(即使lambda的參數類型與std::function
類型不同),而編譯器會抱怨第四種情況:來自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!
因爲:
可以通過更改簽名使用右值引用或const &修復存在從左值到右值的轉換(即所謂的「左值到右值轉換」),但是不存在從右值到左值的轉換。 'std :: function'的構造函數不關心聲明的簽名,而僅僅關於隱含的* call表達式*是否有效。 –
爲什麼不使用'auto'? 'auto idInt = ...' – ZDF