将 *mut T 强制转换为 *mut ManuallyDrop<T> 并对其进行解引用是否属于未定义行为?

3
根据文档,ManuallyDrop<T>是一种零成本的包装器。这是否意味着我可以从指向T的原始指针转换为指向ManuallyDrop<T>的原始指针并进行解引用操作?
1个回答

6

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的指针,底层值本来就不会被丢弃。如果你将指针转换为引用(同时确保遵守引用规则),引用也不会丢弃底层值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接