gpt4 book ai didi

rust - 为什么 `a` 在 Rust 中保留 `let b = &*&a;` 之后的所有权?

转载 作者:行者123 更新时间:2023-12-03 13:32:27 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





What's the difference between &mut unsafe { } and unsafe { &mut }?

(1 个回答)


7 个月前关闭。




我发现 &(*&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由于上述相同的原因。
我们没有 () 的错误因为我们在相同的范围内工作,因此没有真正移动到那里。
编辑(摘自评论),一些相​​关问题:
  • What does “&*” do in Rust
  • What's the difference between &mut unsafe { } and unsafe { &mut }?
  • 关于rust - 为什么 `a` 在 Rust 中保留 `let b = &*&a;` 之后的所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66634808/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com