克服C 20 中類別模板建構子中的冗餘模板參數
在C 20 中,類別模板建構函數的聲明經歷了微妙但有影響力的改變。先前,類別模板的建構子可以選擇在其聲明符中包含模板參數列表,如以下程式碼片段所示:
template<typename T> struct S { S<T>(); };
但是,這種做法現在在 C 20 中已棄用。上面的程式碼將現在會在 -std=c 20 的 gcc trunk 中導致編譯器錯誤。但是,它仍然會在 clang trunk 中使用相同的編譯器進行編譯標準。
更改的理由
刪除類別模板建構子中的冗餘模板參數解決了潛在的錯誤來源。透過要求明確使用注入的類別名,可以在類別模板中聲明建構函數時保留簡單的意圖。
對現有程式碼的影響
此變更可能會對依賴先前有效語法的現有程式碼庫的影響。像上例這樣的有效 C 2017 程式碼可能不再在 C 20 標準下編譯。
受影響程式碼的解決方案
為了適應此更改,可以使用以下替代語法使用:
template<typename T> struct S { S(); // Constructor declaration using the injected class name };
或者,如果需要特定的範本參數,可以使用建構函式重載使用:
template<typename T> struct S { S<T>(); // Constructor declaration with explicit template arguments S<int>(); // Overload for specific template argument };
透過遵守這些語法指南,程式碼庫可以保持與更新的C 20 標準的兼容性。
以上是如何在 C 20 中正確宣告類別模板建構子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!