首頁 >後端開發 >C++ >當呼叫以 lambda 表達式作為參數的函數時,一元運算子如何解決歧義?

當呼叫以 lambda 表達式作為參數的函數時,一元運算子如何解決歧義?

Patricia Arquette
Patricia Arquette原創
2024-11-14 16:22:02412瀏覽

How does the unary   operator resolve ambiguity when calling a function with a lambda expression as an argument?

使用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 和 std::function 的事實所引起的。和 void (*f)().

為了解決這種歧義,在第二次調用中的 lambda 之前使用一元運算符。此運算子將 lambda 表達式轉換為函數指標類型 void (*)(),它與第二個重載完全相符。

依據 C 標準:

  • 一元運算子將參數轉換為其基礎類型(算術、枚舉或指針)。
  • 對於 lambda 表達式,閉包類型中明確轉換函數轉換為具有相同參數和傳回類型的函數指標。

因此,表達式[]() {} 產生一個void (*)() 函數指針,它明確匹配第二個重載.

需要注意的是, lambda 表達式也可以明確轉換為函數指標型別以避免歧義:

foo((void (*)())([]() {}));

以上是當呼叫以 lambda 表達式作為參數的函數時,一元運算子如何解決歧義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn