類別建構子範本推論爭議
範本參數可以方便地從函數參數推斷出來,如以下程式碼所示:
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中文網其他相關文章!