Пожалуйста, учтите мою неопытность, но я не понимаю смысла std::owner_less
.
Я был показан, что не рекомендуется использовать map
с weak_ptr
как ключ, потому что истекший weak_ptr
ключ сломает карту, на самом деле:
Если он истекает, то порядок контейнера прерывается, и попытка использования контейнера впоследствии даст поведение undefined.
Как undefined это поведение? Причина, о которой я прошу, состоит в том, что docs говорят о owner_less
:
Этот функциональный объект предоставляет упорядоченное смешанное поведение на основе владельца (в отличие от основанного на значении) как std:: weak_ptr, так и std:: shared_ptr. Порядок таков, что два смарт-указателя сравнивают эквивалент только в том случае, если они оба пустые или если оба они управляют одним и тем же объектом, даже если значения исходных указателей, полученных методом get(), различны (например, потому что они указывают на разные подобъекты в пределах тот же объект)
Опять же, это моя неопытная речь, но это не похоже на то, что map
будет полностью нарушен expired weak_ptr
:
Возвращает, является ли объект weak_ptr либо пустым, либо больше нет shared_ptr в принадлежащей ему группе владельца.
Истекшие указатели действуют как пустые объекты weak_ptr при блокировке и, следовательно, больше не могут использоваться для восстановления владельца shared_ptr.
Похоже, он может стать более дряблым, чем полностью undefined. Если одна реализация удаляет истекшие слабые_ptrs и просто не используется или не используется для каких-либо затяжных, когда поведение становится undefined?
Если одна из реализаций не учитывает порядок, но нужен только удобный способ связать weak_ptr
с данными, поведение по-прежнему undefined? Другими словами, find
начнет возвращать неправильный ключ?
Карта
Единственная проблема, которую я могу найти в документах, - это то, что указано выше, истекшее значение weak_ptrs вернет эквивалент.
В соответствии с этими docs, это не проблема для реализаций, которые не зависят от порядка и не используют для expired weak_ptr
s:
Ассоциативный
Элементы ассоциативных контейнеров ссылаются на их ключ, а не на их абсолютное положение в контейнере.
упорядоченную
Элементы в контейнере всегда соблюдают строгий порядок. Все вставленные элементы заданы в этом порядке.
Карта
Каждый элемент связывает ключ с отображаемым значением: Ключи предназначены для идентификации элементов, основным содержанием которых является отображаемое значение.
Похоже, что если реализация не связана с порядком и не имеет использования для expired weak_ptr
, тогда нет никакой проблемы, поскольку значения ссылаются на ключ не по порядку, поэтому find
с истечением срока действия weak_ptr
вернется, возможно, другое значение weak_ptr
, но поскольку в этой конкретной реализации нет необходимости использовать его, кроме как erase
d, проблем нет.
Я вижу, как может потребоваться использование weak_ptr
order or expired weak_ptr
, любое приложение, которое может быть, но все поведение кажется далеким от undefined, поэтому a map
или set
по-видимому, не полностью сломан по истечении срока действия weak_ptr
.
Есть ли больше технических объяснений map
, weak_ptr
и owner_less
, которые опровергают эти документы и мою интерпретацию?