Какой смысл в owner_less, если просроченный слабый_птр даст неопределенное поведение?

Пожалуйста, примите во внимание мою неопытность, но я не понимаю смысл std::owner_less.

Мне было показано , что map с 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_ptr с данными, остается ли поведение по-прежнему неопределенным? Другими словами, find начнёт возвращать неправильный ключ?

Map

Единственная проблема, которую я могу найти в документах - это то, на что ссылаются выше, что expired слабый_птрс вернет эквивалент. [тысяча сто сорок два]

Согласно этим документам , это не является проблемой для реализаций, которые не полагаются на упорядочение и не используют истекшие weak_ptr с:

Ассоциативные

Элементы в ассоциативных контейнерах ссылаются по их ключу, а не по их абсолютному положению в контейнере.

Заказано

Элементы в контейнере всегда следуют строгому порядку. Все вставленные элементы имеют позицию в этом порядке.

Карта

Каждый элемент связывает ключ с сопоставленным значением: ключи предназначены для идентификации элементов, основным содержимым которых является сопоставленное значение.

Это звучит так, как если бы реализация не имела отношения к порядку и не использовала для истекших weak_ptr с, тогда нет никаких проблем, потому что на значения ссылаются по ключу, а не по порядку, поэтому find с истекшим сроком weak_ptr ], возможно, вернет другое значение weak_ptr, но, поскольку в данной конкретной реализации оно не используется, за исключением erase d, проблем нет.

Я вижу, как необходимость использования weak_ptr порядка или истекших weak_ptr может быть проблемой, независимо от того, какое приложение это может быть, но все поведение кажется далеко не неопределенным, так что map или set делает не кажется полностью сломанным истекшим weak_ptr.

Есть ли более технические объяснения map, weak_ptr и owner_less, которые опровергают эти документы и мою интерпретацию?

10
задан Community 23 May 2017 в 12:26
поделиться