请考虑到我的经验不足,但我不明白std::owner_less
.
我已经看到不建议使用map
with as 键,因为过期的键会破坏地图,实际上:weak_ptr
weak_ptr
如果它过期了,那么容器的顺序就会被破坏,之后尝试使用容器会给出未定义的行为。
这种行为有多不确定?我问的原因是因为文档说owner_less
:
此函数对象提供 std::weak_ptr 和 std::shared_ptr 的基于所有者(与基于值相反)的混合类型排序。顺序是这样的,两个智能指针只有在它们都是空的或者它们都管理同一个对象时才比较等价,即使 get() 获得的原始指针的值不同(例如,因为它们指向不同的子对象)同一个对象)
同样,这是我缺乏经验的说法,但听起来map
不会被过期weak_ptr
的完全破坏:
返回weak_ptr 对象是空的还是它所属的所有者组中没有更多的shared_ptr。
过期的指针在锁定时充当空的weak_ptr 对象,因此不能再用于恢复拥有的shared_ptr。
听起来它可能会变得比完全未定义更松弛。如果一个人的实现删除了过期的 weak_ptrs 并且根本没有或根本没有使用任何挥之不去的那些,那么行为何时变得未定义?
如果一个人的实现不考虑顺序,而只需要一种方便的方式将weak_ptr
s 与数据相关联,那么行为是否仍然未定义?换句话说,会不会find
开始返回错误的键?
地图
我可以在文档中找到的唯一问题是上面引用的内容,过期的 weak_ptrs 将返回等效的。
根据这些docsweak_ptr
,对于不依赖于 ordering 也不使用 expired s的实现来说,这不是问题:
联想
关联容器中的元素是通过它们的键而不是它们在容器中的绝对位置来引用的。
已订购
容器中的元素始终遵循严格的顺序。所有插入的元素都按此顺序指定一个位置。
地图
每个元素将一个键关联到一个映射值:键用于标识其主要内容是映射值的元素。
听起来如果一个实现不关心 order 也不使用 expired weak_ptr
s 那么就没有问题,因为值是通过 key 而不是 order 引用的,因此find
expiredweak_ptr
可能会返回另一个weak_ptr
s 值,但因为它没有用在这个特定的实现中,除了是erase
d 之外,没有问题。
我可以看到需要使用weak_ptr
ordering 或 expired weak_ptr
s 可能是一个问题,无论可能是什么应用程序,但所有行为似乎都远未定义,因此 a map
orset
似乎并没有被 expired 完全破坏weak_ptr
。
是否有更多的技术解释map
,weak_ptr
和owner_less
反驳这些文档和我的解释?