22

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

汤姆

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

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

4

4 回答 4

17

为什么 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 是唯一的;你如何将它与其他东西进行比较?-如果它是唯一的,它应该总是不同的”)。

于 2013-08-05T12:42:24.880 回答
11

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

于 2013-08-05T09:52:17.323 回答
4

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

于 2013-08-05T09:54:03.797 回答
-1

主要原因可能是因为如果您使用标准智能指针,则不应有任何指向该对象的原始指针。拥有一个指向对象的原始指针几乎可以保证在维护期间的某个时刻,有人最终会从中创建第二个智能指针,这会带来灾难性的后果。(一个例外是空指针,标准确实允许与空指针常量进行比较。)

于 2013-08-05T10:14:05.260 回答