15

例如:

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 意味着程序员忘记了一些东西。作为构造函数参数验证的一部分,我想对此进行测试。

4

1 回答 1

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);
}

演示

关于我对过期weak_ptr仍然保持所有权的最初不确定性:我现在确定一般库范围的线程安全要求要求过期weak_ptr继续拥有相同的所有权。否则,销毁shared_ptr线程 A 中的最后一个剩余部分将不得不明显地修改与weak_ptr所讨论的共享所有权的 one/some/all 的状态shared_ptr。如果线程 B 同时检查这样的状态,weak_ptr那么您将遇到由库实现引入的数据竞争,这通常是被禁止的。

于 2014-11-13T17:15:24.950 回答