Отсутствует равенство между shared_ptr и weak_ptr

Пока я понимаю, почему нет operator== для shared_ptr и unique_ptr, мне интересно, почему нет для shared_ptr и weak_ptr. Тем более, что вы можете создать weak_ptr через ссылку на shared_ptr. Я бы предположил, что в 99% случаев вы хотите lhs.get() == rhs.get(). Я бы сейчас пошел и представил это в свой код, если кто-то не может назвать меня веской причиной, почему никто не должен этого делать.

Ответ 1

weak_ptr Не имеет метода get(), потому что вам нужно явно заблокировать weak_ptr, прежде чем вы сможете получить доступ к основному указателю. Сделать это явным является преднамеренное дизайнерское решение. Если преобразование было неявным, было бы очень легко написать код, который был бы небезопасным, если бы последний shared_ptr для объекта должен был быть уничтожен, в то время как основной указатель, полученный из weak_ptr, все еще изучался.

Эта страница повышения содержит хорошее описание подводных камней и почему weak_ptr имеет такой ограниченный интерфейс.

Если вам нужно выполнить быстрое сравнение, вы можете сделать shared == weak.lock(). Если сравнение истинно, вы знаете, что weak все равно будет действительным, поскольку вы удерживаете отдельный shared_ptr для того же объекта. Нет такой гарантии, если сравнение возвращает false.

Ответ 2

Потому что у него есть стоимость.

A weak_ptr похож на наблюдателя, а не на реальный указатель. Для выполнения какой-либо работы с ним вам сначала нужно получить shared_ptr с помощью метода lock().

Это приводит к приобретению прав собственности, но это так дорого, как копирование регулярного shared_ptr (count increment и т.д.), поэтому он не является тривиальным.

Таким образом, не предоставляя ==, вы вынуждены отступать и фактически проверять, действительно ли вам это нужно или нет.