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

时间:2016-05-23 00:54:20

标签: rust

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

以下代码段显示了不可变引用(& T)实现Copy特征,而可变引用(&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`
}

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

2 个答案:

答案 0 :(得分:2)

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

  

When can my type not be Copy?
  某些类型无法安全复制。例如,复制&mut T将创建别名的可变引用,复制String将导致两次尝试释放相同的缓冲区。
  [...]

答案 1 :(得分:0)

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

fn is_this_type_copy<T: Copy>() {}

fn main() {
    is_this_type_copy::<&u8>();
}

如果类型实现Copy,编译器将产生错误。

您可以对此进行扩展,以询问每个对类型的引用的问题。您现有的代码仅显示对特定类型的不可变引用实现Copy

fn is_every_reference_copy<T>() {
    is_this_copy::<&T>()
}

&mut T执行相同的操作:

fn is_every_mut_reference_copy<T>() {
    is_this_copy::<&mut T>()
}

产生您看到的相同错误:

error[E0277]: the trait bound `&mut T: std::marker::Copy` is not satisfied
 --> src/main.rs:8:5
  |
8 |     is_this_copy::<&mut T>()
  |     ^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `&mut T`
  |
  = note: required by `is_this_copy`

我们已经看到为什么&mut T无法复制,但为什么&T可以被复制?在某种程度上,这是参考的整点。参考是一种廉价共享数据的方式。我们可以简单地为每件事物提供对原始物品的轻量级引用,而不是需要克隆(可能是昂贵的)某些东西给予多件事物。如果无法复制引用,则它们的值不会几乎相同。