根据文档,
ManuallyDrop<T>
是一种零成本的包装器。这是否意味着我可以从指向T
的原始指针转换为指向ManuallyDrop<T>
的原始指针并进行解引用操作?ManuallyDrop<T>
是一种零成本的包装器。这是否意味着我可以从指向T
的原始指针转换为指向ManuallyDrop<T>
的原始指针并进行解引用操作?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方面应该被忽略:它不仅在内存中布局相同,而且在函数调用中也完全相同。
[...]
PtrWithCustomZst
的表现也与*const Foo
完全相同。
我认为执行这种转换是安全的。
ManuallyDrop
结构体的指针似乎毫无意义。如果你有一个指向T
的指针,底层值本来就不会被丢弃。如果你将指针转换为引用(同时确保遵守引用规则),引用也不会丢弃底层值。