我在编译下面的代码时遇到这些错误(代码1)
错误:
v
的寿命不够vec.push(& v);注意:引用必须对以下语句的块后缀有效 0时15分64秒......
注意:...但借来的值仅对块后缀有效 以下陈述2于19:35
(代码1)
fn main() {
let mut vec: Vec<&Inf> = Vec::<&Inf>::new();//<-- It appears the error
let p: Foo1 = Foo1::created();
let v: Foo2 = Foo2::created();
vec.push(&v);
vec.push(&p);
但不是在vec
移动p
和v
之后。
(代码2)
fn main() {
let p: Foo1 = Foo1::created();
let v: Foo2 = Foo2::created();
//It does not appear the error described above
let mut vec: Vec<&Inf> = Vec::<&Inf>::new(); //<-- It does not appear the error
vec.push(&v);
vec.push(&p);
..//
(这种行为可能是正常的,如果有人可以解释我的话。)
这是我创建的类似案例,因此您可以看到错误
错误 play.rust
无错误 play.rust
答案 0 :(得分:5)
是的,这种行为绝对正常且自然。
这是一个更简单的例子:
{
let x = 1;
let mut v = Vec::new();
v.push(&x);
}
此代码编译,但不会:
{
let mut v = Vec::new();
let x = 1;
v.push(&x);
}
这是因为变量破坏的顺序与其构造顺序相反。在上面的示例中,它是这样的:
x created
v created
v[0] = &x
v destroyed
x destroyed
但在最底层我们有这个:
v created
x created
v[0] = &x
x destroyed // x is destroyed, but v still holds a reference to x!
v destroyed
也就是说,在底部示例中,当有一个已经被销毁的x
的未完成引用时,有一个时刻(尽管接近于不可见)。