将*mut T强制解除引用到*mut ManuallyDrop <T>是不确定的行为?

ohb*_*ain 3 unsafe undefined-behavior rust raw-pointer

根据文档,ManuallyDrop<T>是一个零成本的包装.这是否意味着我可以取消引用从原始指针转换ManuallyDrop<T>到的原始指针T

She*_*ter 5

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,
}
Run Code Online (Sandbox Code Playgroud)

#[repr(transparent)]描述为:

该属性可以应用于包含单个字段的类型类型的结构.它表示newtype应该与该字段的类型完全相同,即,对于ABI purpopses [sic]应该忽略newtype:它不仅在内存中布局相同,而且在函数调用中也相同地传递.

[...]

PtrWithCustomZst 也表示完全相同 *const Foo

我相信这种转变是安全的.


真正的问题是你为什么要这样做?指向ManuallyDrop结构的指针似乎毫无意义.如果你有一个指向a的指针T,则不会删除基础值以开始.如果将指针转换为引用(同时确保遵守引用规则),则引用也不会丢弃基础值.