ManuallyDrop
- это , объявленный как #[repr(transparent)]
:
#[stable(feature = "manually_drop", since = "1.20.0")]
#[lang = "manually_drop"]
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct ManuallyDrop<T: ?Sized> {
value: T,
}
#[repr(transparent)]
- , описываемый как :
Атрибут может быть применен к структурам, подобным новому типу, которые содержат одно поле.Это указывает на то, что новый тип должен быть представлен точно так же, как и тип этого поля, т. Е. Новый тип должен игнорироваться для целей ABI [sic]: он не только размещен в памяти одинаково, он также передается идентично в вызовах функций.
[...]
PtrWithCustomZst
также представляется в точности как *const Foo
Я считаю, что это преобразование безопасно выполнить.
Реальный вопрос - , почему вы бы хотели это сделать?Указатель на структуру ManuallyDrop
кажется довольно бессмысленным.Если у вас есть указатель на T
, базовое значение не будет сброшено для начала.Если вы преобразуете указатель в ссылку (гарантируя, что соблюдаете правила ссылок), ссылка также не сбрасывает базовое значение.