首頁  >  文章  >  後端開發  >  為什麼 `std::function` 會導致模板參數簽章不明確?

為什麼 `std::function` 會導致模板參數簽章不明確?

Susan Sarandon
Susan Sarandon原創
2024-11-06 00:42:02965瀏覽

Why Does `std::function` Lead to Ambiguity in Template Argument Signatures?

std::function 模板參數簽章中的歧義

當兩個function 都存在時,就會出現歧義。和函數可以由相同的函數建構。由於 std::function 依賴類型擦除,因此它可以接受任意函數,即使它們的簽章與範本參數簽章不符。

為了說明這一點,請考慮以下類別:

<code class="cpp">template<class Signature>
class myfunc{
public:
    template<class Func>
    myfunc(Func a_func){
        // ...
    }
};</code>

當編譯器嘗試為重載集找到可行的函數時,它會搜尋潛在的轉換。在這種情況下,myfunc 的兩個建構子都會接受任何內容,允許從 int(*)() 到 myfunc 的轉換。並從int(*)() 到myfunc;

因此,當呼叫a(x) 或a(y) 時,編譯器會遇到兩個可行的函數,從而導致歧義。

解決方法

宣告和定義函數時,std::function 的模板參數簽章是其類型的一部分。然而,在物件構造期間,簽名被忽略。

為了避免歧義,可以:

  • 將參數明確轉換為所需的簽章(例如, (function)(x))。
  • 建立適當類型的函數物件並傳遞它。
  • 使用範本元程式設計 (TMP) 擷取簽章並自動轉換。

以上是為什麼 `std::function` 會導致模板參數簽章不明確?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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