为什么在C++0x中没有为std::weak_ptr定义std::hash?

6
阅读关于std::weak_ptr的operator<的讨论后,我看不出为什么定义std::hash为使用std::weak_ptr的控制块不起作用。我也不相信标准委员会会忽略这一点。有人阅读了相关主题的讨论吗?
编辑:关于std::weak_ptr的operator<的讨论 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1590.html
2个回答

4

我对这段历史有些了解。还有一篇更近期的论文也值得阅读:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2637.pdf

我相信这篇较新的论文实际上就是当前草案中的内容。简而言之,shared_ptr拥有基于值的operator<(),以及基于所有权的成员函数owner_before。weak_ptr仅拥有后者。

我最好的猜测是,weak_ptr的哈希支持被忽略了。据我所知,没有人提出为weak_ptr提供哈希支持。在推动C++0x标准化方面,有许多问题需要处理,时间和资源都有限,毫无疑问会出现错误和遗漏。

我认为,要为weak_ptr添加哈希支持,必须与owner_before类似地进行:将owner_hash成员函数添加到shared_ptr和weak_ptr中。我怀疑现在为时已晚,但这似乎是一个合理的TR2提议。


原來日本實際上報告了這件事。 - SamB
那么...对于我们这些需要哈希弱指针,又懒得自己想的人...我们应该写什么代码呢? - Linas
我看不出按照上述owner_hash的方式编写这个函数的客户端方法。客户端根本无法访问需要被散列的字段。只有std::lib实现者才能提供此功能。我不知道客户端如何编写一个不易出错的 weak_ptr 哈希函数。也许有人有好主意... - Howard Hinnant

2

原来,日本对此提出了抱怨(参见 lwg 1406 号问题),而 Howard 在 他的回答中建议的正是所提出的解决方案。不幸的是,由于时间限制,这个解决方案被推迟了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接