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

时间:2013-04-16 18:34:53

标签: c++ hash stl stdhash

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

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

3 个答案:

答案 0 :(得分:13)

  

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

看起来它起源于proposal N1456。 (强调我的)

  

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

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

  

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

有潜在的伤害,是的。

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

指针类型有一个标准的专门化,see here

template< class T > struct hash<T*>;

因此,它可以覆盖char*(作为字节序列而不是C风格的字符串)。

如果你的意思是C风格字符串的专业化,那么从技术上讲,实现它并不是一个问题。但由于C ++中存在std::string的特化,因此对C风格的字符串进行专门化是不值得的。

对于问题的第二部分,您可以在std命名空间中注入所有内容,但是,您获得了什么?这与命名空间的目标背道而驰。拥有自己的命名空间区域。