首頁  >  文章  >  後端開發  >  為什麼模板推演中隱式類型轉換失敗?

為什麼模板推演中隱式類型轉換失敗?

Barbara Streisand
Barbara Streisand原創
2024-10-31 19:31:30231瀏覽

 Why Does Implicit Type Conversion Fail in Template Deduction?

模板推導中的隱式型別轉換

在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標量目的。然而,令人驚訝的是,由於模板參數推導/替換第一次呼叫 func(a, 2) 失敗,程式碼無法編譯。

此失敗背後的原因是模板參數推導不考慮使用者 -定義的轉換。在這種情況下,從 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: :Scalar(T) 不顯式時才有效。

  • 總之,模板參數推導不會自動套用使用者- 定義的轉換。若要在範本參數推導中使用使用者定義的轉換,必須在呼叫方明確轉換參數、使用推導指南(如果適用)或明確實例化所需類型的範本。

    以上是為什麼模板推演中隱式類型轉換失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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