&T/&mut T 类型本身的复制/移动语义文档

yoh*_*hjp 8 rust

我正在寻找有关引用和可变引用类型的复制/移动语义的文档。

以下代码片段显示不可变引用 ( & 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)

但我找不到这种行为的描述。有人知道一些(非)官方文件吗?(还是我错了?)

She*_*ter 5

作为代码的补充,您始终可以要求编译器告诉您是否可以复制类型,即使无法构造该类型:

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被复制呢?在某种程度上,这就是整个参考点。参考是一种廉价地共享数据的方式。我们不需要克隆(可能很昂贵)某个东西来赋予多个东西,我们可以简单地为每个东西提供对原始东西的轻量级引用。如果参考文献无法被复制,它们就不会具有几乎相同的价值。


yoh*_*hjp 4

Rust 的std::marker::Copy特征参考说(感谢@Chris Emerson):

我的类型什么时候不能是 Copy?
有些类型无法安全复制。例如,复制&mut T将创建别名可变引用,并且复制String将导致两次尝试释放同一缓冲区。
[...]