我想聲明一個函數,它將具有特定原型的函數(或lambda)作爲參數。如何在C++中聲明對lambda的引用
的第一次嘗試是:
#include <iostream>
using namespace std;
int test(int (&val)(int)) {
return val(2);
}
int main() {
cout << test([](int v){
return v+100;
});
return 0;
}
在error: invalid initialization of non-const reference of type 'int (&)(int)' from an rvalue of type 'main()::<lambda(int)>'
女巫結果我嘗試添加常量指定的類型,但我不知道確切位置,所以我試圖與海灣合作委員會工作的下面(-std = C++ 14),但我懷疑它是非法的,因爲它沒有鏗鏘:
int test(const auto& val) {
return val(2);
}
我知道我可以使用模板或函數指針或std ::功能實現相同,那麼請考慮這是一個教學問題。我想知道在上面的第二個例子(int test(const auto& val)
)中,GCC推導出什麼類型的val。通過lambda表達式產生
template <typename F>
int test(F val) {
return val(2);
}
int test(int val(int)) {
return val(2);
}
int test(std::function<int(int)> val) {
return val(2);
}
當然,他們建議使用模板或std :: function,但是使用GCC編譯器,即使沒有模板,它也能工作。 – biowep
@cpplearner我認爲這是唯一可能的解釋,你應該發送一個答案。謝謝! – biowep
[通過接受函數指針可以很好地工作](http://rextester.com/JPNGG21655)雖然無捕獲lambda轉換爲函數指針是隱式的,並且函數引用和函數指針之間的轉換也是隱含的,但將這些轉換鏈接在一起也是如此許多。 –