p
Size: a a a
p
IG
std::mem::replace()-ом в другой Box::pin() и инвалидировать все селф-референсы. ))IG
D
IG
unsafe написать такой !Unpin тип, у которого и операции с селф-референсами через пины, и кастомный impl Drop.struct Wtf {
...
_pin: PhantomPinned
}
impl Drop for Wtf {
fn drop(&mut self) {
let wtf = Box::pin(std::mem::replace(self, ...));
... // use the new pin
}
}IG
const члены, в плюсах. Но с другой стороны у плюсов куча compliant реализаций, и каждая подобную ситуацию может разбирать по-своему.в🧇
unsafe написать такой !Unpin тип, у которого и операции с селф-референсами через пины, и кастомный impl Drop.struct Wtf {
...
_pin: PhantomPinned
}
impl Drop for Wtf {
fn drop(&mut self) {
let wtf = Box::pin(std::mem::replace(self, ...));
... // use the new pin
}
}IG
> Concretely, for pinned data you have to maintain the invariant that its memory will not get invalidated or repurposed from the moment it gets pinned until when drop is called. Only once drop returns or panics, the memory may be reused.replace считается за repurpose, а с другой из &mut self мы новый пин без ансейфа не сделаем, а без пина мы UB не вызовем. Так что point скорее чисто академический.)E
E
K
M
K
E
MS
D
K
MB
MB
KR