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

10

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

下面的代码片段展示了不可变引用(& 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
能够复制可变引用会暗示你可以在Rust中同时拥有多个指向同一对象的可变引用...但实际上不行。 - Simon Whitehead
感谢您的评论。我理解他们的行为,但我正在寻找一些有文献支持的资源。 - yohjp
2
请参阅有关rustdoc未显示内置类型的Copy impls的问题:https://github.com/rust-lang/rust/issues/25893 - oli_obk
5
Rust的Copy文档提到&mut T不是Copy - Chris Emerson
2个回答

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

我的类型何时不能被复制?
有些类型不能被安全地复制。例如,复制&mut T会创建一个别名可变引用,复制String将导致两次尝试释放相同的缓冲区。
[...]


1
这个链接是:当我的类型不能被复制时? - Ta Thanh Dinh

4
作为您代码的补充,即使无法构建该类型,您始终可以要求编译器告诉您该类型是否可以复制:
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 呢?从某种意义上说,这就是引用的全部意义。引用是一种廉价共享数据的方式。我们不需要克隆(可能很昂贵)为多个事物提供相同的内容,而是可以简单地给原始内容的每个事物一个轻量级的引用。如果引用不能被复制,它们将没有多少价值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接