为什么 std::unique_ptr 有相等运算符?

Why does std::unique_ptr have an equality operator?

我最近一直在考虑这个问题,我能看到的关于 std::unique_ptr 有一个相等运算符的唯一论点是为了完整性,所以标准模板库中的所有智能指针都有它。但是除非你做错了什么,否则我看不到任何可能 return true.

的例子

显然可以这样做:

int* a = new int(1);
std::unique_ptr<int> u_a1(a);
std::unique_ptr<int> u_a2(a);

if(u_a1 == u_a2)
{
    std::cout << "I'm double deleting soon" << std::endl;
}

但是,包含运算符不是只允许人们在编译器不抛出错误的情况下犯这些错误吗?删除它不是更有意义吗,还是我遗漏了什么?

您可以使用它来检查 unique_ptr 是否为空,您还可以引用 unique_ptr,这样您就可以使用它来查看它们是否引用相同的 unique_ptr。

平等实际上可以return为真。最简单的情况是两个空指针:

std::unique_ptr u_a1;
std::unique_ptr u_a2;

if (u_a1 == u_a2) // ...

运算符还允许比较 unique_ptr<T, D> 具有不同类型的对象,因此您可能有两种不同的删除器类型,它们将在清理时对同一指针执行不同的操作。或者甚至是默认删除器以外的某些删除器,它可以故意多次执行相同的操作(计数器?)。

运算符的存在也可能使类型在某些模板中有效,这些模板恰好想要比较其依赖类型的对象。

智能指针旨在具有与原始指针相同的语义,只是添加了自动所有权语义。由于可以比较原始指针,因此它们的智能指针对应物也可以。比较 2 unique_ptrs 是否有意义是另一回事。