Rust 为什么'fn(&;T)`没有实现'Clone'特性?
以下代码不起作用,因为类型Rust 为什么'fn(&;T)`没有实现'Clone'特性?,rust,Rust,以下代码不起作用,因为类型fn(&u16)未实现克隆特征: 当然,我可以自己实施: impl Clone for FStruct{ fn clone(&self) -> Self{ unsafe{ let mut t: FStruct = std::mem::uninitialized(); std::ptr::copy_nonoverlapping(self, &mut t, 1);
fn(&u16)
未实现克隆
特征:
当然,我可以自己实施:
impl Clone for FStruct{
fn clone(&self) -> Self{
unsafe{
let mut t: FStruct = std::mem::uninitialized();
std::ptr::copy_nonoverlapping(self, &mut t, 1);
t
}
}
}
但这有点烦人。Rust只允许对用户类型实现Clone
,因此我需要fn(&T)
周围的结构或枚举
这个实现真的可以安全使用吗?为什么默认情况下,fn(&T)
没有实现克隆?原因很简单:直到。从该版本开始,您的代码将编译
在此之前,由于历史的特殊性,fn
指针确实实现了Copy
,即使它们没有实现Clone
(尽管这显然是不可能的)。因此,您可以执行以下操作:
FStruct的impl克隆{
fn克隆(&self)->self{
FStruct(self.0)
}
}
这是安全且易于理解的。…因此,如果您将
fn(&i16)
传递给一个函数,该函数将执行T:Copy
并继续尝试克隆它,您将得到一个“错误:内部编译器错误:在trans
过程中遇到错误`Unimplemented`选择`Binder()`有趣!
impl Clone for FStruct{
fn clone(&self) -> Self{
unsafe{
let mut t: FStruct = std::mem::uninitialized();
std::ptr::copy_nonoverlapping(self, &mut t, 1);
t
}
}
}