例如:
std::weak_ptr<int> wp1(std::make_shared<int>());
std::weak_ptr<int> wp2;
assert(PointsToValidOrExpiredObject(wp1));
assert(!PointsToValidOrExpiredObject(wp2));
这样的功能可能吗?
用例:类的构造函数将std::weak_ptr<Foo>
作为依赖项。传递过期的对象是可以的(可能在某些工作流程中发生),但传递null意味着程序员忘记了某些事情。我想在构造函数的参数验证中测试它。
答案 0 :(得分:17)
std::weak_ptr::owner_before
可以区分空指针和过期的弱指针。因此,您可以将PointsToValidOrExpiredObject
实现为:
template <typename T>
bool PointsToValidOrExpiredObject(const std::weak_ptr<T>& w) {
return w.owner_before(std::weak_ptr<T>{}) ||
std::weak_ptr<T>{}.owner_before(w);
}
Regarding the original uncertainty I had about an expired weak_ptr
still maintaining ownership:我现在确定一般的图书馆范围的线程安全要求要求过期的weak_ptr
继续具有相同的所有权。否则,销毁线程A中最后剩余的shared_ptr
将必须显着修改与所讨论的weak_ptr
共享所有权的一个/部分/全部shared_ptr
的状态。如果线程B同时检查这样的weak_ptr
的状态,那么你将会有一个由库实现引入的数据竞争,这通常是被禁止的。