根据 [util.smartptr.weak.obs]/4,
weak_ptr::owner_before
严格的弱排序是这样的:“两个 shared_ptr
或 weak_ptr
实例是等价的,当且仅当它们共享所有权或都为空时.”
但是,我在标准中没有看到任何内容定义
weak_ptr
为空意味着什么。显然默认构造的 weak_ptr
是空的,由空 weak_ptr
构造的 shared_ptr
也是空的,但似乎没有明确说明过期的 weak_ptr
是否为空。
虽然我没有看到标准保证它,但owner_before
订购的可用性
1要求:
weak_ptr
已过期2 不为空。这是因为只有对象的突变才应该改变其在排序中的位置,并且
weak_ptr
可能会在没有发生突变的情况下过期。
1 例如,这里有人使用
weak_ptr
作为 std::set
中的键:如何计算 std::weak_ptr 的哈希值?。这样做,以及 std::map
同样,需要订单在到期后继续存在。如果有一个 owner_hash
允许与 std::unordered_set
和 std::unordered_map
一起使用,那么该哈希值也必须在过期后继续存在。
2 请注意“已过期”和“已过期”之间的细微差别 - 构造为空或分配有空指针值的
weak_ptr
具有 expired() == true
。但它并没有过期(动作动词),它是在过期状态下创建的。我的答案仅适用于 weak_ptr
值,这些值在某些时候未过期,然后由于 shared_ptr
值与目标分离而(被动地)过期。