可以将过期的weak_ptr与未初始化的weak_ptr区分开来吗?

dlf*_*dlf 15 c++ weak-ptr c++11

例如:

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

assert(PointsToValidOrExpiredObject(wp1));
assert(!PointsToValidOrExpiredObject(wp2));
Run Code Online (Sandbox Code Playgroud)

这样的功能可能吗?

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

Cas*_*sey 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);
}
Run Code Online (Sandbox Code Playgroud)

演示.

关于最初的不确定性我对过期的weak_ptr仍然保持所有权:我现在确定一般的图书馆范围的线程安全要求要求过期weak_ptr继续拥有相同的所有权.否则,销毁shared_ptr线程A中的最后剩余部分将必须显着地修改weak_ptr与所shared_ptr讨论的共享所有权的一个/一些/所有s 的状态.如果线程B同时检查了这种状态,weak_ptr那么你将会有一个由库实现引入的数据竞争,这通常是被禁止的.