没有标准的方法来比较智能指针和常规指针

No standard way to compare smart pointer with regular pointer?

本文关键字:指针 智能 常规 比较 标准 方法      更新时间:2023-10-16

为什么C++标准不包括比较运算符来比较智能指针(unique_ptr、shared_ptr…)和常规指针(t*)?

Tom

更新我不想知道如何做到这一点。问题是为什么它没有被定义为C++标准的一部分?对于unique_ptr和shared_ptr,这样的定义是微不足道的。

这方面的用例如下:类A有一个带有unique_ptr键的映射。unique_ptr用于内存管理。当类a的用户传递了一个常规指针时,将在此映射中执行查找。不幸的是,该标准没有定义比较运算符。

为什么C++标准不包括比较运算符来比较智能指针(unique_ptr、shared_ptr…)和常规指针(t*)?

这一决定背后的原则通常被称为"使您的界面易于正确使用,而难以/不可能错误使用"。

从概念上讲,智能指针和原始指针是不同的。

智能指针会施加限制(即"unique_ptr是一个指针,但不能有多个副本")。尽管它们的行为类似于指针(指向一个点——如果你可以原谅双关语的话),但它们有不同的语义。

也就是说,如果你有:

int *p1 = new int{5};
std::unique_ptr<int> p2{new int{5}};
p1 == p2.get();

这种比较很容易做,很明确,而且很明显你在比较苹果和苹果(很容易理解发生了什么——你在与原始指针的值进行比较)。

另一方面,使用自定义比较运算符会引发奇怪的问题("unique_ptr是唯一的;你怎么能将它与其他东西进行比较?-如果它是唯一的,它应该总是不同的")。

你可以只做smart_ptr.get() == raw_ptr,这有什么错?

因为比较运算符不比较所指向的内容,只比较实际的指针。由于智能指针拥有实际原始指针的"所有权",任何其他原始指针都不能与智能指针相同。

主要原因可能是标准智能指针,不应该有任何原始指针对象。有一个指向对象的原始指针几乎保证在维护过程中的某个时刻,有人会最终从中创建了第二个智能指针后果。(一个例外是空指针标准不允许与空指针常量进行比较。)