std::weak_ptr 什么时候为空?过期的 std::weak_ptr 是否为空?

问题描述 投票:0回答:1

根据 [util.smartptr.weak.obs]/4

weak_ptr::owner_before
严格的弱排序是这样的:“两个
shared_­ptr
weak_­ptr
实例是等价的,当且仅当它们共享所有权或都为空时.”

但是,我在标准中没有看到任何内容定义

weak_ptr
为空意味着什么。显然默认构造的
weak_ptr
是空的,由空
weak_ptr
构造的
shared_ptr
也是空的,但似乎没有明确说明过期的
weak_ptr
是否为空。

c++ language-lawyer std weak-ptr
1个回答
3
投票

虽然我没有看到标准保证它,但owner_before订购的可用性

1
要求:

  • A
    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
值与目标分离而(被动地)过期。

© www.soinside.com 2019 - 2024. All rights reserved.