我最近一直在考虑这个问题,我能看到的为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;
}
但是,包含运算符难道不允许人们在编译器不抛出错误的情况下犯这些错误吗?去掉它不是更有意义吗,还是我错过了什么?
Equality实际上可以返回true。最简单的情况是两个空指针:
std::unique_ptr u_a1;
std::unique_ptr u_a2;
if (u_a1 == u_a2) // ...
运算符还允许比较具有不同类型的unique_ptr<T, D>
对象,因此可能有两种不同的deleter类型,它们将在清理时对同一指针执行不同的操作。或者甚至是默认删除程序之外的某个删除程序,它故意可以多次执行相同的操作(计数器?(。
运算符的存在也可能使该类型在某些模板中有效,而这些模板恰好希望比较其依赖类型的对象。
智能指针的语义与原始指针相同,只是添加了自动所有权语义。由于原始指针可以进行比较,因此它们的智能指针对应物也可以进行比较。比较2个unique_ptr
是否有意义是另一回事。
您可以使用它来检查unique_ptr是否为null,还可以引用unique_ptr's,这样您就可以使用它查看它们是否引用了相同的unique_ptr。