可变字符串引用实现了Copy吗?

3

在下面的代码中,我本来期望编译器会在hello函数的第二次调用中发出关于 使用已移动的值: xref 的警告,因为可变引用不实现Copy。但是编译器没有引发任何此类错误。我在这里漏掉了什么?

fn main() {
    let mut x: String = "Developer".to_string();
    let x_ref: &mut String = &mut x;
    hello(x_ref);
    hello(x_ref);
}

fn hello(a: &mut String) {
    println!("Hello {}", a);
}

1
关于您已删除的评论——由于现有的问题标题非常不同,他们在提问之前将无法找到这些问题——是的,这正是SO有重复问题的原因。通过将您的问题标记为重复,人们可以在使用您的措辞时找到正确的答案。通过删除您的问题,您剥夺了这种可能性。重复并不是坏事 - Shepmaster
1个回答

4
你的例子使用了可变引用,允许编译器执行隐式再借用。这基本上将代码转换为:
    hello(&mut *x_ref);
    hello(&mut *x_ref);

现在你有两个独立的可变借用,每个借用仅在函数调用的生命周期内,因此它们不会相互冲突。
如果您尝试同时使用它两次,则会出现错误。
fn main() {
    let mut x: String = "Developer".to_string();
    let x_ref: &mut String = &mut x;
    hello(x_ref, x_ref);
}

fn hello(a: &mut String, b: &mut String) {
    println!("Hello {} and {}", a, b);
}

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