在Rust中,为什么`a`在`letb=&*&a;`之后保留所有权?
我发现它令人困惑&(*&a)并且&{*&a}行为不同。
详细地说,以下代码编译失败:
struct CanNotCopy;
fn main(){
let a = CanNotCopy;
&{*&a};
let c = a;
}
并编译了以下代码:
struct CanNotCopy;
fn main(){
let a = CanNotCopy;
&(*&a); // or &*&a;
let c = a;
}
上述代码之间的语义区别是什么?
究竟哪些语言结构会导致所有权的转移?
回答
通过使用{}你移动 a到一个新的范围,那么你玩哪个引用和间接引用。也可以简化为:
struct CanNotCopy;
fn main(){
let a = CanNotCopy;
{a};
let c = a;
}
你会遇到同样的问题,现在让我们转向另一个问题。想象一下,您在范围之前有一个参考:
struct CanNotCopy;
fn main(){
let a = CanNotCopy;
let aa = &a;
{aa};
let c = a;
}
这是有效的,因为我们只是移动引用而不是原始对象本身。
*与&然后的操作如何:
struct CanNotCopy;
fn main(){
let a = CanNotCopy;
let aa = &a;
&{*aa};
let c = a;
}
cannot move out of *aa which is behind a shared reference由于上述相同的原因,我们得到了一个。
我们没有那个错误,()因为我们在相同的范围内工作,因此没有真正移动到那里。
编辑(摘自评论),一些相关问题:
-
“&*” 在 Rust 中有什么作用
-
&mut unsafe { } 和 unsafe { &mut } 有什么区别?
THE END
二维码