首頁 > 後端開發 > C++ > 為什麼不能像函式模板那樣為類別建構子推斷 C 模板參數?

為什麼不能像函式模板那樣為類別建構子推斷 C 模板參數?

DDD
發布: 2024-12-08 17:44:12
原創
210 人瀏覽過

Why Can't C   Template Parameters Be Inferred for Class Constructors Like Function Templates?

類別建構子範本推論爭議

範本參數可以方便地從函數參數推斷出來,如以下程式碼所示:

template <typename T>
void swap(T& a, T& b) {
  T temp = a;
  a = b;
  b = temp;
}
登入後複製

但是,類別建構子不允許使用類似的方法,這在C 中引起了疑問程式設計師。為什麼不呢?

這種不一致背後的原因在於物件建構的複雜性。建構函數不是類別的唯一入口點。複製建構函式和賦值運算子也發揮著至關重要的作用,僅從建構函式推斷模板參數可能會導致歧義。

考慮以下範例:

template <typename T>
class Variable {
  T data;
public:
  Variable(T d) { data = d; }
};
登入後複製

如果允許範本推斷,則以下程式碼是有效的:

Variable var(2); // Equivalent to Variable<int> var(2);
登入後複製

但是如果我們使用複製構造或賦值會怎麼樣運算符?

MyClass m(string s);
MyClass *pm;
*pm = m;
登入後複製

在這種情況下,編譯器決定 MyClass pm 的模板類型將具有挑戰性。

為了緩解這個問題,C 17 引入了從建構子參數進行型別推導。這允許從建構函數參數推斷模板參數,從而消除在某些情況下對顯式類型參數的需求。例如:

std::pair p(2, 4.5); // Inferred as std::pair<int, double> p(2, 4.5);
std::tuple t(4, 3, 2.5); // Inferred as std::tuple<int, int, double> t(4, 3, 2.5);
登入後複製

需要注意的是,此推理功能仍在開發中,可能會在未來的 C 標準中進行修改。儘管如此,它標誌著朝著簡化程式碼和提高類型安全性邁出了重要一步。

以上是為什麼不能像函式模板那樣為類別建構子推斷 C 模板參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板