shared_ptr 的相等运算符定义如下:
template<class T, class U> inline bool operator==(
shared_ptr<T> const & a, shared_ptr<U> const & b)
{
return a.get() == b.get();
}
这似乎坏了。将相等性转发到 a 和 b 指向的内容不是更好吗?或者这会对图书馆的用户造成不公平的限制(因为他们必须提供平等运算符)?
如果我有一个包含 shared_ptrs 的 map 或 hash_table,那么当前的定义会使相等性不可用。例如,考虑
std::map<int, std::tr1::shared_ptr<T> > m1, m2;
我们不想检查 m1 和 m2 中每个 int 的 ptrs 是否指向相同的值?
我可以通过将 m1、m2 展平来实现我自己的相等性(从每个构造集合,沿途取消引用 shared_ptrs)。是否有一个 STL 技巧可以完成这个或其他方式来在 shared_ptrs 存在的情况下巧妙地测试相等性?
原文由 user231536 发布,翻译遵循 CC BY-SA 4.0 许可协议
它没有损坏,因为
shared_ptr
在概念上是一个指针,因此它实现了 指针 相等。当你测试两个指针是否相等时,你想知道它们是否指向内存中的同一个地方。