我正在寻找有关引用和可变引用类型的复制/移动语义的文档。
以下代码片段显示不可变引用 ( & T) 实现了Copytrait 而可变引用 ( &mut T) 没有。
struct T;
fn copyable<U>(_: U) where U: Copy {}
fn main() {
let a = &T;
copyable(a); // OK
let b = &mut T;
copyable(b);
// error: the trait `core::marker::Copy` is not implemented for the type `&mut T`
}
Run Code Online (Sandbox Code Playgroud)
但我找不到这种行为的描述。有人知道一些(非)官方文件吗?(还是我错了?)
作为代码的补充,您始终可以要求编译器告诉您是否可以复制类型,即使无法构造该类型:
fn is_this_type_copy<T: Copy>() {}
fn main() {
is_this_type_copy::<&u8>();
}
Run Code Online (Sandbox Code Playgroud)
如果类型没有实现,Copy编译器将产生错误。
您可以扩展它以询问对类型的每个引用的问题。您现有的代码仅显示对特定类型的不可变引用实现Copy:
fn is_every_reference_copy<T>() {
is_this_copy::<&T>()
}
Run Code Online (Sandbox Code Playgroud)
为 做同样的事情&mut T:
fn is_every_mut_reference_copy<T>() {
is_this_copy::<&mut T>()
}
Run Code Online (Sandbox Code Playgroud)
产生与您看到的相同的错误:
fn is_this_type_copy<T: Copy>() {}
fn main() {
is_this_type_copy::<&u8>();
}
Run Code Online (Sandbox Code Playgroud)
我们已经看到了为什么&mut T不能被复制,但是为什么可以&T被复制呢?在某种程度上,这就是整个参考点。参考是一种廉价地共享数据的方式。我们不需要克隆(可能很昂贵)某个东西来赋予多个东西,我们可以简单地为每个东西提供对原始东西的轻量级引用。如果参考文献无法被复制,它们就不会具有几乎相同的价值。
Rust 的std::marker::Copy特征参考说(感谢@Chris Emerson):
我的类型什么时候不能是 Copy?
有些类型无法安全复制。例如,复制&mut T将创建别名可变引用,并且复制String将导致两次尝试释放同一缓冲区。
[...]