C 語言允許從函數參數推斷模板參數,但不允許從類別建構子推斷模板參數。這可能會提出一個問題:為什麼不允許建構函式進行這種推斷?
不允許建構函式進行範本推論的一個原因是建構函式不是類別的唯一入口點。複製建構子和賦值運算子提供了創建類別物件的其他方法。允許建構函數進行模板推斷將要求編譯器在確定模板參數時考慮所有這些入口點,這可能會導致語法歧義。
class MyClass { int a; int b; public: MyClass(int a, int b): a(a), b(b) {} };
在此範例中,如果允許建構函式進行範本推斷,使用複製建構函式或賦值運算子建立 MyClass 物件時,不清楚應該使用哪些範本參數。
不允許模板推理的另一個原因對於建構函數來說,它可能會導致意外的行為。考慮以下程式碼:
class MyContainer { std::vector<T> vec; }; int main() { MyContainer<int> container; // explicitly specify template parameter MyContainer container2(vec); // infer template parameter from constructor }
在此範例中,可以使用明確指定的範本參數或特定類型的向量來建構 MyContainer 類別。如果建構函式允許範本推斷,則第二行程式碼將建立 T 類型的 MyContainer。但是,這可能不是預期的行為,因為使用者可能想要建立 int 類型的 MyContainer。
由於這些問題,類別建構子不允許進行模板推論。然而,在 C 17 中,可以使用部分模板特化來實現類似的效果。部分模板特化允許使用者為特定類型指定模板參數,同時保留其他模板參數進行推斷。
template <typename T> class MyContainer { std::vector<T> vec; }; template <> class MyContainer<int> { std::vector<int> vec; }; int main() { MyContainer container; // infer template parameter to 'int' MyContainer<double> container2; // explicitly specify template parameter }
在此範例中,MyContainer 類別具有 int 的部分模板特化。這表示當使用 int 型別建立 MyContainer 時,範本參數將自動推斷為 int。對於其他類型,必須明確指定模板參數。
以上是為什麼 C 不允許建構函式進行模板參數推斷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!