模板推導中的隱式型別轉換
在C 語言中,隱式型別轉換機制在範本參數推導中扮演關重要的作用。然而,在某些情況下,它可能會導致意外的行為,如下面的程式碼片段所示:
<code class="cpp">#include<iostream> using namespace std; template<typename Dtype> class Scalar{ public: Scalar(Dtype v) : value_(v){} private: Dtype value_; }; template<typename Dtype> void func(int a, Scalar<Dtype> b){ cout << "ok" << endl; } int main(){ int a = 1; func(a, 2); // Incorrect conversion //int b = 2; //func(a, b); // Also incorrect return 0; }
在提供的程式碼中,目標是透過將int 隱式轉換為來調用模板函數func標量
此失敗背後的原因是模板參數推導不考慮使用者 -定義的轉換。在這種情況下,從 int 到 Scalar
要解決此問題,有幾個選項:
明確轉換在呼叫方站點: 透過手動提供Scalar
<code class="cpp">func(a, Scalar<int>{2}); </code>
推導指南: 為Scalar 定義推導指南並呼叫func:
<code class="cpp">func(a, Scalar{2}); // C++17 only</code>
這種方法依賴預設的推導指南,在這種情況下就足夠了。
明確實例化:明確實例化所需類型的func 範本:
<code class="cpp">func<int>(a, 2); </code>
僅當Scalar
總之,模板參數推導不會自動套用使用者- 定義的轉換。若要在範本參數推導中使用使用者定義的轉換,必須在呼叫方明確轉換參數、使用推導指南(如果適用)或明確實例化所需類型的範本。
以上是為什麼模板推演中隱式類型轉換失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!