C 11 Lambda 函數的類型推導限制
C 11 允許模板類型推導,但在lambda 函數或std 時存在限制: :涉及到函數。當使用帶有模板參數的函數時,編譯器通常可以從參數類型推斷出模板類型。但是,當直接在參數中使用 lambda 時,此推導會失敗。
問題陳述
以下程式碼無法推導函數 filter() 的範本類型:
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // ... }
當使用 lambda當函數作為比較參數直接呼叫此函數時,編譯器會引發錯誤:
filter(mySet, [](int i) { return i % 2 == 0; }); // Throws an error
錯誤原因
此錯誤的根本原因在於 lambda 函數的本質。雖然它們的行為類似於函數對象,但它們並不是真正的函數。 Lambda 函數不會隱式轉換為 std::function 對象,這將允許編譯器推斷類型。
解決方法
存在多種解決方法來解決推導問題:
1。明確範本參數:
明確指定範本參數:
filter<int>(mySet, [](int i) { return i % 2 == 0; });
2.建立一個std::function 物件:
將lambda 函數轉換為std::function物件並將其作為參數傳遞:
std::function<bool(int)> compare = [](int i) { return i % 2 == 0; }; filter(mySet, compare);
3.使用替代函數定義:
重新定義filter() 函數以接受通用比較函數物件:
template<class Value, class CompareType> set<Value> filter(const set<Value>& input, CompareType compare) { // ... }
現在,可以直接使用lambda 函數來呼叫函數:
filter(mySet, [](int i) { return i % 2 == 0; });
結論
Lambda函數提供了定義短期函數的便利方法,但它們可能會引入模板類型推導的複雜性。透過了解限制並使用適當的解決方法,開發人員可以有效地利用 C 11 程式碼中的 lambda。
以上是為什麼「filter()」中的 Lambda 函數的 C 11 模板類型推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!