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

Fla*_*ace 5 c++ smart-pointers unique-ptr comparison-operators c++11

我最近一直在考虑它,我能看到的关于 std::unique_ptr 具有相等运算符的唯一参数是为了完整性,因此标准模板库中的所有智能指针都有它。但是,除非您做错了什么,否则我看不到任何可能返回的示例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;
}
Run Code Online (Sandbox Code Playgroud)

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

asc*_*ler 8

平等实际上可以返回true。最简单的情况是两个空指针:

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

if (u_a1 == u_a2) // ...
Run Code Online (Sandbox Code Playgroud)

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

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