使用Lambda 函數的一元運算子解決不明確重載
在提供的程式碼片段中:
void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([]() {}); // ambiguous foo(+[]() {}); // resolves to function pointer overload }
第一個對foo 的呼叫不明確,無法編譯。這種歧義是由於 lambda 表達式可以隱式轉換為 std::function
為了解決這種歧義,在第二次調用中的 lambda 之前使用一元運算符。此運算子將 lambda 表達式轉換為函數指標類型 void (*)(),它與第二個重載完全相符。
依據 C 標準:
因此,表達式[]() {} 產生一個void (*)() 函數指針,它明確匹配第二個重載.
需要注意的是, lambda 表達式也可以明確轉換為函數指標型別以避免歧義:
foo((void (*)())([]() {}));
以上是當呼叫以 lambda 表達式作為參數的函數時,一元運算子如何解決歧義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!