首頁  >  文章  >  後端開發  >  為什麼「std::function」的模板參數會導致重載解析中的歧義?

為什麼「std::function」的模板參數會導致重載解析中的歧義?

Barbara Streisand
Barbara Streisand原創
2024-11-06 03:45:02738瀏覽

Why Does `std::function`'s Template Argument Lead to Ambiguity in Overload Resolution?

儘管定義了類型,Std::Function 的模板參數中仍存在歧義

在這種情況下,函數“a”存在多個重載,每個重載接受std::function:

  • function
  • function

的不同簽名由於兩個function 都存在,因此產生了歧義。和函數可以由相同的函數建構。 VS2010 中定義的std::function 建構子允許從不同來源進行建構:

template<class _Fx>
function(_Fx _Func, typename _Not_integral<!...int>::_Type = 0);

本質上,任何物件都可以轉換為std::function,從而促進類型擦除並能夠處理任意對象作為函數。

為了進一步說明問題,請考慮以下簡化範例:

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

在'a' 的重載解析期間,如果無法辨識可行的重載,編譯器會嘗試使用參數的建構函數或參數的轉換運算子來轉換參數。在這種情況下,轉換是透過 myfunc 的建構函數進行的。

由於 myfunc 的建構子接受任何內容,因此兩個 function 都可以接受任何內容。和函數可以轉換為 myfunc

最終,這會導致編譯器無法確定要呼叫 'a' 的哪個重載,從而導致歧義。

To解決這個問題,你有幾個選擇:

  1. 維護明確轉換:
    明確轉換可以為編譯器指定所需的重載:a((functionx))
  2. 函數物件:
    建立適當類型的函數物件: `function; fx = x;
    函數; fy = y;`
  3. 模板元程式設計:
    使用模板元程式來取得正確的簽章:`template
    struct get_signature{...};`

以上是為什麼「std::function」的模板參數會導致重載解析中的歧義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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