簡體   English   中英

是`模板 <typename> ;`合法的C ++?

[英]Is `template<typename>;` legal C++?

GCCClangtemplate<typename>; 看法不一致template<typename>; 是全局范圍內C ++中的有效語句。

我希望它不允許在C ++標准中,因為模板化屬於聲明語句,而不是表達式語句,因此也不屬於空語句(語句; )。

那么,這是Clang中的一個錯誤嗎?

這是clang的特殊行為已經存在了很長時間:缺少聲明只會產生警告。 它跟這個一樣:

int;

g ++會顯示錯誤,而clang只會顯示警告。 這與標准不矛盾。

警告:聲明不聲明任何內容[-Wmissing-declarations]

-Werror=missing-declarations設置正確。

並不是的。 該標准在[temp] p2中明確禁止這樣的聲明;

模板 聲明中的聲明 (如果有的話)應該

  • 聲明或定義函數,類或變量,或

  • 定義成員函數,成員類,成員枚舉或類模板或嵌套在類模板中的類的靜態數據成員,或者

  • 定義類或類模板的成員模板,或

  • 是一個演繹指南 ,或

  • 是一個別名聲明

空聲明與這些子句中的任何一個都不匹配。 現在標准規定,需要一個實現來發出任何違反其規則的診斷消息,比如這個。 請注意,它表示診斷 ,它不指定是發出警告還是錯誤(甚至是注釋)。 編譯器可以提供擴展,使您編寫的內容有效,因為它不會改變格式良好的程序的含義。

所以不,兩者都是對的。 但是,clang的行為是由於擴展,而不是標准指定的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM