取消将* mut T转换为* mut ManuallyDrop <t>是不确定的行为吗?

时间:2018-10-27 03:25:14

标签: rust undefined-behavior unsafe raw-pointer

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

1 个答案:

答案 0 :(得分:5)

ManuallyDropdeclared as #[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)]described as

  

该属性可以应用于包含单个字段的类似于新类型的结构。它指示新类型应完全按照该字段的类型表示,即,对于ABI目的[new],应忽略新类型:不仅在内存中布局相同,而且在函数调用中传递相同的内容。      

[...]

     

PtrWithCustomZst的表示也与*const Foo

完全相同

我相信执行此转换是安全的。


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