C++ 是否可以将过期的弱ptr与未初始化的弱ptr区分开来?

C++ 是否可以将过期的弱ptr与未初始化的弱ptr区分开来?,c++,c++11,weak-ptr,C++,C++11,Weak Ptr,例如: std::weak_ptr<int> wp1(std::make_shared<int>()); std::weak_ptr<int> wp2; assert(PointsToValidOrExpiredObject(wp1)); assert(!PointsToValidOrExpiredObject(wp2)); std::weak_ptr wp1(std::make_shared()); 标准:弱ptr wp2; 断言(PointsToVal

例如:

std::weak_ptr<int> wp1(std::make_shared<int>());
std::weak_ptr<int> wp2;

assert(PointsToValidOrExpiredObject(wp1));
assert(!PointsToValidOrExpiredObject(wp2));
std::weak_ptr wp1(std::make_shared());
标准:弱ptr wp2;
断言(PointsToValidOrExpiredObject(wp1));
断言(!PointsToValidOrExpiredObject(wp2));
这样的功能可能吗

用例:类的构造函数将
std::weak_ptr
作为依赖项。传递过期对象是可以的(可能发生在某些工作流中),但传递null意味着程序员忘记了一些事情。作为构造函数参数验证的一部分,我想对此进行测试。

可以区分空指针和过期指针。因此,您可以将
指向ValidorExpiredObject的点实现为:

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);
}
模板
bool PointsToValidOrExpiredObject(常量标准::弱\u ptr&w){
返回w.owner_before(std::weak_ptr{})||
std::弱的{}.owner_在(w)之前;
}


:我现在确信,通用库范围的线程安全要求要求过期的
弱\u ptr
继续拥有相同的所有权。否则,销毁线程A中最后剩余的
shared_ptr
将不得不明显地修改与所讨论的
shared_ptr
共享所有权的一个/部分/所有
弱_ptr
的状态。如果线程B同时检查这样一个
弱\u ptr
的状态,那么库实现将引入一个通常被禁止的数据竞争。

您是否查看了该方法?@Borgeader。是的——不幸的是,这两种情况下都返回true。虽然似乎有答案,但一个不太神奇的解决方案可能是将弱指针封装在一个只能使用非空共享指针构造的类型中,并且需要该类型而不是原始的弱指针。事实似乎确实如此。指针相当于“如果它们共享所有权或都为空”,并且没有任何迹象表明弱指针在过期时变为空(并停止共享所有权)。太棒了!我必须在
文档之前查阅
所有者(owner),以了解这意味着什么以及它为什么起作用。对于其他处于相同情况的函数:您可以将此函数视为
运算符