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