C 20 中類別模板建構子可以有冗餘模板參數清單嗎?
在C 17 中,允許聲明類別模板建構子具有冗餘的模板參數列表,如下所示code:
template<typename T> struct S { S<T>(); };
但是,隨著C 20 的出現和相容性變更的實施,上述程式碼現在在GCC trunk 上引發錯誤(對於-std=c 20)。另一方面,Clang trunk 可以毫無問題地編譯程式碼。這種不一致引出了一個問題:這是一個錯誤還是尚未在編譯器之間完全實現的有意破壞性更改?
答案
答案在於C 20 規格的細微變化。具體來說,修改了以下部分:
[class.ctor]
「建構子由聲明引入,該聲明的聲明符是以下形式的函數聲明符:
ptr-declarator ( parameter-declaration-clause ) noexcept-specifier attribute-specifier-seq
其中ptr 聲明符僅包含id 表達式、可選的attribute-specifier-seq,和可選的括號,id-表達式具有以下形式之一:「
對於類別模板中的成員聲明,id-表達式現在必須是注入的類別名直接封閉實體。
因此,雖然 C 17 允許 S
因此,在使用 -std=c 20 的 GCC 主幹上遇到的錯誤不是錯誤,而是破壞的跡象C 20 中引入的更改。尚未實現此變更的編譯器將繼續成功編譯舊程式碼,而已實作此變更的編譯器將遵守新的要求。
以上是C 20 類別模板建構子可以省略冗餘模板參數清單嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!