3

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

4

1 回答 1

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,
}

#[repr(transparent)]描述为

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

[...]

PtrWithCustomZst也完全像*const Foo

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


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

于 2018-10-27T15:41:38.333 回答