在阅读了关于 std::weak_ptr 的 operator< 的讨论之后,我看不出为什么定义 std::hash 以使用 std::weak_ptr 的控制块不起作用。我也不敢相信标准委员会忽略了这一点。有人阅读过有关该主题的相关讨论吗?
编辑:关于 std::weak_ptr http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1590.html的运算符<的讨论
在阅读了关于 std::weak_ptr 的 operator< 的讨论之后,我看不出为什么定义 std::hash 以使用 std::weak_ptr 的控制块不起作用。我也不敢相信标准委员会忽略了这一点。有人阅读过有关该主题的相关讨论吗?
编辑:关于 std::weak_ptr http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1590.html的运算符<的讨论
我对历史有些熟悉。您还应该阅读另一篇稍后的论文:
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。我怀疑对 C++0x 执行此操作为时已晚,但这似乎是一个合理的 TR2 提议。
事实证明,日本对此提出了抱怨(参见lwg issue 1406),而正是霍华德在他的回答中提出的建议作为决议。不幸的是,它被推迟了(大概是因为时间限制)。