为什么不是';t std::hash<;T>;专门用于字符*? < C++ >标准为什么不指定代码> STD::Hash < /代码>专门用于 char */COD>, const char */COD>,无符号char */COD>, conn-无符号char */COD>等?也就是说,它将散列C字符串的内容,直到找到终止null为止

为什么不是';t std::hash<;T>;专门用于字符*? < C++ >标准为什么不指定代码> STD::Hash < /代码>专门用于 char */COD>, const char */COD>,无符号char */COD>, conn-无符号char */COD>等?也就是说,它将散列C字符串的内容,直到找到终止null为止,c++,hash,stl,stdhash,C++,Hash,Stl,Stdhash,将我自己的专门化注入到我自己的代码的std名称空间中的任何伤害?char*(及其同类)并不总是指字符串。它们可以是简单的字节数组、二进制文件转储或任何数量的其他内容。如果你在C++中表示字符串,则通常使用“string”类。 至于创建自己的,鉴于上述情况,这是一个坏主意。但是,对于用户定义的类型,可以在std::命名空间中创建std::函数的专门化 < C++ >标准为什么不指定代码> STD::Hash < /代码>专门用于 char */COD>, const char */COD>,未签名

将我自己的专门化注入到我自己的代码的
std
名称空间中的任何伤害?

char*(及其同类)并不总是指字符串。它们可以是简单的字节数组、二进制文件转储或任何数量的其他内容。如果你在C++中表示字符串,则通常使用“string”类。 至于创建自己的,鉴于上述情况,这是一个坏主意。但是,对于用户定义的类型,可以在std::命名空间中创建std::函数的专门化

< C++ >标准为什么不指定代码> STD::Hash < /代码>专门用于<代码> char */COD>,<代码> const char */COD>,<代码>未签名CHAR*<代码>,<代码> conn-无符号char */COD>等?< /P> 它看起来像是起源于。(强调矿山)

一些早期的哈希表实现对char*进行了特殊处理:它专门化了默认哈希函数,以查看指向的字符数组,而不是指针本身。这项建议取消了这种特殊待遇。特殊处理使C字符串使用哈希表稍微容易一些,但要降低消除一致性和编写通用代码的成本。由于天真的用户通常希望使用std::basic_字符串而不是C字符串,因此特殊处理的成本大于好处

如果我正确地解释了这一点,那么原因是支持C风格的字符串会破坏通常作用于指针哈希的代码

为我自己的代码将我自己的专门化注入std名称空间有什么害处吗

有潜在的危害,是的

  • 将来,添加到
    std
    名称空间的任何内容都可能与新的符号名发生冲突
  • 目前,您添加到
    std
    名称空间的任何内容都可能与标准库的其他组件“更好地匹配”,从而悄悄地破坏行为

    • 指针类型有一个标准的专门化

      templatestruct hash;
      
      因此,它也可以覆盖
      char*
      (作为字节序列而不是C样式的字符串)

      如果您指的是C风格字符串的专门化,那么实现它在技术上没有问题。但是,由于C++中的代码:String 是专门化的,所以不需要对C风格字符串进行专门化。
      对于问题的第二部分,您可以在
      std
      名称空间中注入所有内容,但是,您得到了什么?这与名称空间的目标背道而驰。拥有自己的命名空间区域。

      我认为
      char*
      unsigned char*
      在哈希上下文中是不安全的,其他使用
      const
      限定符的都可以。不要注入到
      std::
      ,只需在您的命名空间中进行专门化。您的
      std::hash
      存储的
      const char*
      的生存期是多少?(
      std::hash
      存储其键值并对其进行散列)。如何区分以null结尾的
      const char*
      和指向单个字符的指针?
      std::hash
      只是一个函子对象。它散列了自己的论点。它不存储它。完全有效的问题和答案由事实和参考资料支持。如果您想知道如何实际地对C字符串进行哈希,那么……关于唯一的时间<代码> char */COD>被视为指针,在C++标准库中的空终止缓冲区是继承的FROM C代码,<代码> STD::String < /C> >和在一些<代码> STD::OsStrase代码中。我想不出其他地方了?我知道
      char*
      并不总是指字符串。我想知道的是,你的答案是否是C++标准委员会正在考虑的。<代码>可以接受创建STD的专门化::STD中的函数::命名空间。< /代码>是什么?很难知道他们在想什么,但我会认为,因为它们的代码必须是所有人的全部东西,这当然是一个考虑因素。我认为明确不允许专门化const char*,但我目前找不到引用C++0x N3000草案17.6.3.2.1.1(但标准应包含类似部分):“[…]只有在声明依赖于用户定义的外部链接类型,且专门化满足原始模板的标准库要求且未明确禁止的情况下,程序才能将任何标准库模板的模板专门化添加到命名空间std中。“有时值得努力,因为如果使用char*作为键,如果使用字符串散列,我们将需要为每个散列支付额外的内存分配和拷贝。
      template< class T > struct hash<T*>;