首页 文章

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

提问于
浏览
3

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

以下代码片段显示了不可变引用( & T )实现 Copy trait和可变引用( &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 回答

  • 2

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

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

  • 0

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

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

    如果类型 not 实现 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 ?在某种程度上,这是参考的整个点 . 参考是一种廉价共享数据的方式 . 我们可以简单地为每件事物提供对原始物品的轻量级引用,而不是需要克隆(可能是昂贵的)某些东西给予多件事物 . 如果引用无法具有几乎相同的值 .

相关问题