[英]Specializing a template class as a struct
我剛剛使用以下方法專門為用戶定義的類型專門化std::hash
:
template<>
struct hash<...> {...};
當VC10向我發出警告時:
警告C4099:'std :: hash <_Kty>':使用'struct'時首先看到使用'class'看到的類型名稱
我發現它的標准庫將std::hash
聲明為class
,而標准(或我最新的自由草案)將其聲明為struct
。
好吧,當然我知道結構與類沒有任何不同(除了不同的默認訪問和繼承類型)。 但我的問題是:
class
s交換struct
(當然,只要成員所需的訪問類型保持一致)? 首先,這是從14.5.1 [temp.class]第4段中得到的答案:
在重新聲明,部分特化,顯式特化或類模板的顯式實例化中,類 - 密鑰應與原始類模板聲明一致。
但是,根據7.1.6.3 [dcl.type.elab]第3段最后一句, struct
和class
引用相同的類 - 鍵:
精細類型說明符中存在的class-key或enum關鍵字應與精心設計類型說明符中的名稱所引用的聲明一致。 [...]因此,在任何詳細類型說明符中,enum關鍵字應用於引用枚舉,union class-key應用於引用union,以及類或struct class-key應該用於引用使用class或struct class-key聲明的類。
嘗試g ++,clang和EDG都同意可以將聲明為struct
的模板專門化為class
。 然而,clang警告說從struct
改為class
,反之亦然。 基於此,標准庫可以自由選擇它認為適合定義的任何關鍵字。 顯然,如果編譯器拒絕代碼,結果會嚴重破壞,但我認為這是編譯器而不是在這種情況下出錯的庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.