Rc.ptr относится Unpin? Там нет такой же штуки для RcBox например. Вроде бы логично, запрещаем двигать RcBox чтобы не сломать указатели.
В документации написано, что является Unpin. И почему это нельзя пиннить
— !Unpin не запрещает двигаться обычным значениям — RcBox нельзя двигать в принципе, у пользователей нет доступа к ней
Не стоит смотреть внутрь Rc, чтобы понять гарантии Pin, поскольку их инварианты друг от друга напрямую не зависят. Пусть у нас будет: Pin<P>, type T = <P as Deref>::Target. Тогда, если T: Unpin, то Pin<P> = P. В противном случае написавший структуру или перечисление утверждает, что та ссылается на себя прямо или опосредованно. Поэтому P должен быть указателем (неважно, простым, умным или в виде ссылки): для гарантии стабильного адреса. Сам Box/Rc волен свободно перемещаться, но не память в куче. В дополнение !Unpin запрещает DerefMut по умолчанию (в сейфе) и в принципе не даёт мут ссылок, как раз для того, чтобы нельзя было без ансаунда заставить поинтер внутри структуры провиснуть.
Обсуждают сегодня