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