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

时间:2013-08-05 09:50:56

标签: c++ c++11

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

汤姆

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

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

4 个答案:

答案 0 :(得分: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();

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

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

答案 1 :(得分:9)

你可以smart_ptr.get() == raw_ptr,这有什么问题?

答案 2 :(得分:4)

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

答案 3 :(得分:1)

主要原因可能是因为如果你正在使用 标准智能指针,应该没有任何原始指针 物体。几乎有一个指向对象的原始指针 保证在维护期间的某个时刻,某人会 最终创建了第二个智能指针,带有灾难 后果。 (一个例外是空指针,而且 standard允许与空指针常量进行比较。)