虽然我理解为什么shared_ptr
和unique_ptr
没有operator==
,但我想知道为什么shared_ptr
和weak_ptr
也没有。尤其是因为您可以通过对shared_ptr
的引用来创建weak_ptr
。
我认为在99%的情况下,您希望使用lhs.get() == rhs.get()
进行比较。除非有人能告诉我一个好的理由不这样做,否则我会在我的代码中引入这个操作符。
虽然我理解为什么shared_ptr
和unique_ptr
没有operator==
,但我想知道为什么shared_ptr
和weak_ptr
也没有。尤其是因为您可以通过对shared_ptr
的引用来创建weak_ptr
。
我认为在99%的情况下,您希望使用lhs.get() == rhs.get()
进行比较。除非有人能告诉我一个好的理由不这样做,否则我会在我的代码中引入这个操作符。
weak_ptr
没有get()
方法,因为你需要在访问底层指针之前显式地锁定weak_ptr
。这样做是一个有意的设计决策。如果转换是隐式的,那么很容易编写不安全的代码,如果最后一个指向该对象的shared_ptr
在仍在检查从weak_ptr
获得的底层指针时被销毁。
这个boost页面对陷阱和为什么weak_ptr
具有如此有限的接口有很好的描述。
如果您需要快速比较,则可以执行shared == weak.lock()
。如果比较结果为true,则知道weak
必须仍然有效,因为您持有到相同对象的单独shared_ptr
。如果比较返回false,则没有这样的保证。
lock
确实更有意义。这是一个好的设计决策。 - abergmeierlock
是不必要的昂贵操作,也不能提供稳定的比较。请参见我的答案以获取解决方案。 - rdb因为它需要成本。
weak_ptr
像观察者,而不是真正的指针。要使用它进行任何工作,您首先需要使用其lock()
方法从中获取一个shared_ptr
。
这具有获取所有权的效果,但与复制常规shared_ptr
一样费用高昂(计数增加等...),因此这并不是微不足道的。
因此,通过不提供==
,您被迫退后,并实际检查您是否真的需要它。
weak_ptr
引用相同的实体,则它必须是有效的(或为0),否则我们不关心它是否有效。 - Konrad Rudolphweak_ptr
获取指针,被迫通过shared_ptr
进行操作。所以... - Matthieu M.shared_ptr
和weak_ptr
的实现方式,只适用于相当有限的用例。 - Matthieu M.template<class T>
bool owner_equals(std::shared_ptr<T> &lhs, std::weak_ptr<T> &rhs) {
return !lhs.owner_before(rhs) && !rhs.owner_before(lhs);
}
std :: weak_ptr
, 如果您想知道它们(曾经)是否引用了同一个对象,因为控制块将持续(至少)与所有弱引用一样长时间。请注意,如果您正在使用std :: shared_ptr
的别名特性,则可能无法产生预期的结果。这是一种让您创建两个具有相同控制块但存储不同指针的std :: shared_ptr
实例的功能。
weak_ptr
没有get
方法。 - CB Bailey