fn main() {
// block1: fails
{
let mut m = 10;
let n = {
let b = &&mut m;
&**b // just returning b fails
};
println!("{:?}", n);
}
// block2: passes
{
let mut m = 10;
let n = {
let b = &&m;
&**b // just returning b fails here too
};
println!("{:?}", n);
}
}
block1 失败,并显示以下错误:
error[E0597]: borrowed value does not live long enough
--> src/main.rs:7:22
|
7 | let b = &&mut m;
| ^^^^^^ temporary value does not live long enough
8 | &**b // just returning b fails
9 | };
| - temporary value dropped here while still borrowed
...
12 | }
| - temporary value needs to live until here
我正确的假设是内部不可变引用扩展到 block2 范围之外,而在 block1 中,即使存在外引用吗?
答案 0 :(得分:6)
在这里,将可变借款视为获取参考值所有权的非Copy
结构(在下面的摘要中为S
)就足够了。这种模型代表了可变借款的排他性。
基于此模型的原因:在block2中,n
是对原始m
的引用,而在block1中,n
将是对{{1}的副本的引用}由可变借贷拥有。在两个块中,内部引用都在let块的末尾删除,但是仅在块1中,这会引起问题,因为在块1中,m
的引用目标仍归内部引用所有参考已删除。
n
在struct S { m: i32 }
let mut m = 10;
let n = {
let s = S { m };
let b = &s;
&(*b).m
}; // s is dropped
println!("{:?}", n);
上方的代码段中,拥有s
副本的所有权。引用m
指向n
的副本,该副本在删除n
时被删除-不允许。如果s
是非副本,则m
将被移到m
中,这将具有相同的含义。
在块2中,原始s
是直接借用的,而不复制它。如果强行复制,将得到与block1相同的错误:
m