使用Unary Plus 解決函數重載中的歧義
在給定的程式碼片段中:
void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([]() {}); // ambiguous foo(+[]() {}); // not ambiguous (calls the function pointer overload) }
在給定的程式碼片段中:
第一次呼叫由於不明確,使用lambda 表達式作為參數的foo 無法編譯。然而,在 lambda 之前使用一元進行的第二次呼叫會解析為函數指標重載。
一元加號的作用[] 中使用的運算子是一元加號運算子。在 C 標準中定義為將算術、無範圍枚舉或指標類型的操作數轉換為操作數的值。 在這種情況下,雖然 lambda 表達式不是算術類型,但可以轉換為轉換為函數指標類型。
轉換為函數指標型別根據C 標準,沒有lambda 捕獲的lambda 表達式有一個公共轉換函數來指向函數指標型別函數與lambda 的函數呼叫運算符具有相同的參數和返回類型。 因此,一元強制將 lambda 表達式轉換為函數指標型別 void (*)()。
重載解析第二個重載void foo(void (*f)()) 與重載解析完全匹配,因為參數類型void (* )()匹配參數型別。第一個重載 void foo(std::function
以上是一元加運算子如何解決 Lambda 表達式函數重載中的歧義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!