根据 [util.smartptr.weak.obs]/4,
然而,在标准中我并没有看到定义
weak_ptr::owner_before
严格弱序是这样的:"如果两个 shared_ptr
或者 weak_ptr
具有相同的所有权或者都为空,则它们等价。"然而,在标准中我并没有看到定义
weak_ptr
空的内容。显然,一个默认构造的 weak_ptr
是空的,由一个空 shared_ptr
构造的 weak_ptr
也是空的,但是看起来并没有明确说明过一个已经过期的 weak_ptr
是否为空。
weak_ptr
是指use_count()
返回0的情况,因为这似乎是默认构造、移动和过期的weak_ptr
能够同质地使用lock()
和expired()
所必需的。 - François Andrieuxshared_ptr
,"empty" is defined 的定义为:“当其未拥有一个指针时,称shared_ptr
为空。”-- 显然,对于weak_ptr
,此定义并不适用,因为weak_ptr
永远不会拥有一个指针。 - Ben Voigtshared_ptr
实例共享的元数据块”作为一种可能性。这种情况在任何规范中都没有被排除。直接回应逻辑论点——“空”意味着use_count() == 0
,而expired() == true
等同于use_count() == 0
,但expired() == 0
并不意味着“空”,因为use_count() == 0
并不意味着“空”。声称如此是犯了逆命题谬误。 - Ben Voigtweak_ptr
为空并没有什么“意义”;它只是一个weak_ptr
对象可能具有的特定状态的名称。定义如何将对象置于该状态或从该状态中取出以及空状态对各种操作的影响就足够了。但是,过期的weak_ptr
是否为空仍然是一个有效的问题,并且可以通过询问过期的weak_ptr
是否必须等于空的weak_ptr
来使其更加具体化。 - Nate Eldredgeowner_before()
在指向已过期的指针上应该如何行为。在gcc/clang测试中,似乎两个曾经共享同一对象所有权的weak_ptr
在后来过期后,在owner_before()
下仍然是等价的。这意味着尽管“拥有”的对象不再存在,它们仍然“共享所有权”。 - Nate Eldredge