Предположим, что он существует с типами Strong<T>
и Weak<T>
. Как вы используете Weak<T>
? Вам нужен какой-то ошибочный шаг «обновления», так до чего обновляется Weak<T>
? Это не может быть простая ссылка (как вы сказали), потому что Strong<T>
должно знать, существуют ли какие-либо «обновленные» Weak<T>
. В противном случае он может освободить свое хранилище, пока значение все еще используется.
Таким образом, Weak<T>
должен быть обновлен до какого-то типа SemiWeak<T>
, который поддерживает базовое распределение... а это именно то, что является общим владением.
Что, если бы вы каким-то образом гарантировали, что Strong<T>
нельзя будет освободить до того, как все Weak<T>
исчезнут? Поздравляем, вы только что заново изобрели T
и &T
: вместо них вы могли бы буквально использовать их.
Итак, а что, если вы сделали так, чтобы Weak<T>
обновлялся до SemiWeak<'a, T>
, привязанного к сроку службы Weak<T>
, так что он не может пережить его, а может только быть временным? Все, что вы на самом деле делаете в этом случае, — это скрываете тот факт, что у вас есть совместное владение. Под капотом SemiWeak
все еще нужно гарантировать, что лежащий в основе Strong
не исчезнет. Вы можете тривиально построить такой тип из Rc<T>
примерно за десять минут. Это фактически даст вам тип, который точно такой же, как Rc<T>
, с той же производительностью и затратами памяти, но менее полезный.
Кроме того, этот метод get_mut
не может существовать. Невозможно предотвратить существование SemiWeak<T>
. Если вы не используете заимствование, но, опять же, это просто использование T
и &T
.
Итак, нет, я не думаю, что это существует, и я не верю, что может быть в той форме, которую вы описали.
И наконец, наличие Weak<T>
вообще является формой совместного владения, потому что эти Weak<T>
должны указывать на что-то. В случае Rc<T>
слабый счетчик хранится рядом с сильным счетчиком, поэтому, хотя значение может быть уничтожено, выделение само сохраняется. Вы могли бы разделить их, но теперь вы платите за два выделения и двойную косвенность (вероятно, приводящую к большему количеству промахов кеша).
08.06.2018