如何理解"std::relational operators (shared_ptr) compares directly the stored pointers"

How to comprehend "std::relational operators (shared_ptr) compares directly the stored pointers"

根据文档 (http://www.cplusplus.com/reference/memory/shared_ptr/operators/),它说: [强调我的]

The comparison compares directly the stored pointers (i.e., the value the objects dereference to, and not their owned pointer (i.e., the managed objects that are deleted on destruction), which may not be the same in alias shared_ptr objects (alias-constructed objects and their copies).

我能理解某些人提到的文档中的示例代码degree.But我无法理解上面的引号。

有人可以通过一些简单的例子来说明并解释何时使用这个运算符是有意义的吗?

我困惑了很久。如果能对这个问题有所帮助,我将不胜感激。

下面是我能在一定程度上理解的示例代码:

// shared_ptr relational operators
#include <iostream>
#include <memory>

int main () {
  std::shared_ptr<int> a,b,c,d;

  a = std::make_shared<int> (10);
  b = std::make_shared<int> (10);
  c = b;

  std::cout << "comparisons:\n" << std::boolalpha;

  std::cout << "a == b: " << (a==b) << '\n';
  std::cout << "b == c: " << (b==c) << '\n';
  std::cout << "c == d: " << (c==d) << '\n';

  std::cout << "a != nullptr: " << (a!=nullptr) << '\n';
  std::cout << "b != nullptr: " << (b!=nullptr) << '\n';
  std::cout << "c != nullptr: " << (c!=nullptr) << '\n';
  std::cout << "d != nullptr: " << (d!=nullptr) << '\n';

  return 0;
}

比方说,你有这个结构:

struct Foo { int a, b; };

然后你可以像这样生成别名共享指针:

void f()
{
    // create
    shared_ptr<Foo> orig(new Foo{1, 2});
    // aliased pointer 1, points into object held by orig
    shared_ptr<int> pa(orig, &orig->a);
    // aliased pointer 2, ditto
    shared_ptr<int> pb(orig, &orig->b);

    assert(pa != pb);    // passes
}

即使 papb 共享同一个对象的所有权(它们碰巧也与 orig 共享),正如您所期望的那样,它们携带不同的指针.

我 post 一个已被其创建者删除的答案。我认为理解问题中的示例代码很有帮助。希望对看到这个问题的人有帮助。

A shared_ptr 指向它管理的一个对象。这是您通过 shared_ptr::get 获得的那个。 shared_ptrs a 和 b 上的表达式 a == b 测试 a 和 b 是否指向同一个对象,即是否 a.get() == b.get()。在这种情况下 returns 是正确的。如果a和b指向不同的对象,即使这两个对象比较相等,结果也是false。

让我们看一下示例代码:

a = std::make_shared<int> (10);
b = std::make_shared<int> (10);

这将创建两个指向不同整数对象的共享指针。即使这两个整数对象的值相同为 10,它们仍然是不同的对象。所以 a.get() 将不同于 b.get(),因此 a==b returns false.

但是,一旦您分配

c = b 两个 shared_ptrs b 和 c 将指向同一个对象,例如 b.get() returns 指向与 c.get() 相同的对象的指针。因此,c == b returns true.

a和b指向不同的对象,而b和c共享同一个对象,可以说明如下:

a = std::make_shared<int> (10);
b = std::make_shared<int> (10);
c = b;

*b = 30;  // change the value of the managed object.

std::cout << *a << std::endl; // still prints 10;
std::cout << *b << std::endl; // prints 30;
std::cout << *c << std::endl; // prints 30, as it points to the same integral object as b
Hope it got clearer.