使用一元加運算子解決Lambda 重載的歧義
在C 中,透過提供具有不同參數類型的多個實作來重載函數可以實現靈活性在程式碼重用方面。但是,當嘗試使用 lambda 表達式呼叫函數時,如果 lambda 可以滿足多個重載,則可能會出現歧義。
歧義問題
考慮以下程式碼片段:
第一次使用lambda 表達式[]() 呼叫foo 會變得不明確,因為編譯器無法確定要使用哪個重載。 std::function 和函式指標重載都是可行的候選者。
使用一元加運算子解決歧義
表示法,在本例中為一元加運算符,可以用來解決這種歧義。透過將一元加號放在lambda 表達式之前,它會強制轉換為函數指標類型:
此轉換使函數指標重載與參數類型完全匹配的void (*)() ,並消除歧義。
一元加運算子
C 標準中定義的一元加運算子具有下列屬性:
"一元運算子的運算元應具有下列屬性:
"一元運算子的運算元應算術、無範圍枚舉或指標類型,且結果是參數的值。 "
對於lambda,儘管沒有算術或指標類型,但它可以由於其閉包類型的屬性,將轉換為void (*)()。 lambda 的閉包型別有一個到函數指標的非明確轉換函數,其參數和傳回型別與 lambda 的函數呼叫運算子相同。
選擇函數指標重載透過一元加強制轉換為void (*)(),第二個重載void foo(void (*f)( )) 在重載解析排名中變得完全匹配。由於它是唯一的精確匹配,因此明確選擇它。
替代方法或者,將 lambda 明確轉換為函數指標型別以避免歧義,一可以使用:以上是在 C 中重載 Lambda 時,一元加運算子如何解決歧義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!