为什么std :: hash <T>不专用于char*?

Pau*_*cas 10 c++ hash stl stdhash

为什么没有C++标准规定,std::hash<T>是专门为char*,const char*,unsigned char*,const unsigned char*,等?即,它将散列C字符串的内容,直到找到终止空值.

将我自己的特化注入我自己std的代码的命名空间有什么危害吗?

Dre*_*ann 13

为什么没有C++标准规定,std::hash<T>是专门为char*,const char*,unsigned char*,const unsigned char*,等?

看起来它起源于提案N1456.(强调我的)

一些早期的哈希表实现给了char*特殊处理:它专门用于查看指向的字符数组的默认哈希函数,而不是指针本身.该提案删除了这种特殊待遇.特殊处理使得对C字符串使用哈希表稍微容易一些,但代价是去除一致性并使编写通用代码变得更加困难.由于天真的用户通常会使用std :: basic_string而不是C字符串,因此特殊处理的成本超过了收益.

如果我正确地解释了这一点,那么推理是支持C样式字符串会破坏通常用于指针散列的代码.

将我自己的特化注入我自己的代码的std命名空间有什么危害?

是的,有潜在的危害.

  • 将来,您添加到std命名空间的任何内容都可能与新的符号名称冲突.
  • 在目前,您添加到std命名空间的任何内容都可以与标准库的其他组件"更好地匹配",从而无声地破坏行为.


Joe*_*oel 6

char*(及其同类)并不总是指字符串.它们可以是简单的字节数组或二进制文件转储或任何其他数量的东西.如果你的意思是C++中的字符串,你通常使用"字符串"类.

至于创建自己的,鉴于上述情况,这是一个坏主意.但是,对于用户定义的类型,可以在std :: namespace中创建std :: functions的特化.

  • `可以在std :: namespace中创建std :: functions的特化.是吗? (2认同)