Пока я понимаю, почему нет 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 и т.д.), поэтому он не является тривиальным.
Таким образом, не предоставляя ==
, вы вынуждены отступать и фактически проверять, действительно ли вам это нужно или нет.