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

Tom*_*eyn 14 c++ c++11

为什么C++标准不包含比较运算符来比较智能指针(unique_ptr,shared_ptr,...)和常规指针(T*)?

汤姆

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

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

utn*_*tim 14

为什么C++标准不包含比较运算符来比较智能指针(unique_ptr,shared_ptr,...)和常规指针(T*)?

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

从概念上讲,智能指针和原始指针是不一样的.

智能指针强加限制(即"unique_ptr是一个指针,但你不能有多个副本").虽然它们的行为类似于指针(如果您愿意为双关语辩解),它们具有不同的语义.

也就是说,如果你有:

int *p1 = new int{5};
std::unique_ptr<int> p2{new int{5}};

p1 == p2.get();
Run Code Online (Sandbox Code Playgroud)

比较很容易做到,明确,并且很明显你比较苹果和苹果(很容易理解发生了什么 - 你正在与原始指针的值进行比较).

另一方面,拥有自定义比较运算符会产生奇怪的问题("unique_ptr是唯一的;如何将其与其他东西进行比较? - 如果它是唯一的,它应该总是不同").


Ton*_*ion 9

你可以做smart_ptr.get() == raw_ptr,有什么不对吗?

  • @MasterT错误的问题.为什么要这样? (3认同)
  • 我知道那行得通。为什么标准不允许直接比较?例如,考虑在具有智能指针键类型的地图中查找。您需要定义自己的比较器才能使其正常工作。 (2认同)
  • @R。马蒂尼奥·费尔南德斯 没有错误的问题。只是不完整的答案。 (2认同)
  • 例如,假设你有一个 `vector&lt;unique_ptr&lt;T&gt;&gt;` 并且你想找到一个特定的 `T*`。目前,您必须将 `std::find_if` 与 lambda 谓词一起使用,以便解包和比较 `unique_ptr`。使用建议的 `operator==`-overload,一个更具可读性的 `std::find` 将成为可能。 (2认同)