我刚刚使用以下方法专门针对用户定义类型 std::hash
:
template<>
struct hash<...> {...};
当VC10向我发出警告时:
警告C4099:'std :: hash <_Kty>':使用'struct'现在看到的'class'首次看到的类型名称
我发现它的标准库声明 std::hash
为 class
,而标准(或我最新的自由草案)将其声明为 struct
.
好吧,当然我知道结构与类没有任何不同(除了不同的默认访问和继承类型) . 但我的问题是:
-
VC10是否违反此标准,或者是否可以在任何标准库组件中为
class
s交换class
s(当然,只要成员所需的访问类型保持一致)? -
将模板类专门化为结构是否合法,反之亦然,或者这会带来名称解析等问题(至少VC10认为值得警告) .
2 回答
首先,这是从14.5.1 [temp.class]第4段中得到的答案:
但是,根据7.1.6.3 [dcl.type.elab]第3段最后一句,
struct
和class
指的是同一个类密钥:尝试g,clang和EDG都同意可以将声明为
struct
的模板专门化为class
. 但是,clang警告说已经从struct
变为class
,反之亦然 . 基于此,标准库可以自由选择它认为适合定义的任何关键字 . 显然,如果编译器拒绝代码,结果会严重破坏,但我认为这是编译器而不是在这种情况下出错的库 .1:我不确定,但我相信这是一个错误 .
对于2:唐't worry, it shouldn' t导致任何奇怪的行为 . 请注意您定义的函数范围 . 至于警告,it is actually pretty general(即不是特别为模板制作),所以我不会太在意它 .
编辑:另请参阅this问题的答案,这基本上说它在标准上没有任何区别,但是有些编译器可能表现得很奇怪 .