首頁  >  文章  >  後端開發  >  C 20 類別模板建構子可以省略冗餘模板參數清單嗎?

C 20 類別模板建構子可以省略冗餘模板參數清單嗎?

Patricia Arquette
Patricia Arquette原創
2024-11-19 15:12:03369瀏覽

Can C  20 Class Template Constructors Omit Redundant Template Parameter Lists?

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() 作為模板 S 中的建構子聲明,但 C 20 需要 S() 來代替。此更改有效地消除了冗餘並與 CWG 2237 保持一致,解決了潛在的容易出錯的做法。

因此,在使用 -std=c 20 的 GCC 主幹上遇到的錯誤不是錯誤,而是破壞的跡象C 20 中引入的更改。尚未實現此變更的編譯器將繼續成功編譯舊程式碼,而已實作此變更的編譯器將遵守新的要求。

以上是C 20 類別模板建構子可以省略冗餘模板參數清單嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn