C++ shared_ptr等于运算符

use*_*536 11 c++ equality map shared-ptr

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();
}
Run Code Online (Sandbox Code Playgroud)

这似乎破了.把这种平等转移到a和b所指的是不是更好?或者这是对图书馆用户的不公平限制(因为他们必须提供一个平等运营商)?

如果我有一个包含shared_ptrs的map或hash_table,那么当前定义会使等式无法使用.例如,考虑一下

std::map<int, std::tr1::shared_ptr<T> > m1, m2;
Run Code Online (Sandbox Code Playgroud)

我们不想检查m1和m2中每个int的ptrs是否指向相同的值?

我可以通过展平m1,m2 out来实现我自己的相等性(从每个构造集合,沿途取消引用shared_ptrs).是否有一个STL技巧可以完成这个或其他方式在shared_ptrs存在的情况下整齐地测试相等性?

Fre*_*Foo 42

它没有被破坏,因为a shared_ptr在概念上是一个指针,因此它实现了指针式的相等性.当您测试两个指针是否相等时,您想知道它们是否指向内存中的相同位置.


Tim*_*ter 6

我认为这个想法是比较两个shared_ptr实例和比较两个指针一样有用.如果你想要一个std::map包含shared_ptrs 普通旧指针的对象,你将不得不用比较两种情况下指向对象的东西来覆盖谓词.

在比较两个映射的情况下,您可能希望使用std::equal带有谓词的版本.