- 此问题在此处已有答案**:
Why can I return a reference to a local literal but not a variable?(1个答案)
why does rust allow a local struct reference had static lifetime? [duplicate](1个答案)
2天前关闭。
我有下面代码,
enum List<'a> {
Cons(i32, Box<&'a List<'a>>),
Nil,
};
let list= Cons(10, Box::new(&Nil));
let lista = Cons(5, Box::new(&Cons(10, Box::new(&Nil))));
match lista {
Cons(x,_) => println!("{}",x),
Nil => ()
}
运行代码后,编译器会显示
21 | let lista = Cons(5, Box::new(&Cons(10, Box::new(&Nil))));
| ^^^^^^^^^^^^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
| |
| creates a temporary which is freed while still in use
我可以理解'cons(10,box::new(& Nil))'是免费的,所以它出错了。但是当我在匹配后用lista替换list时,例如:
match list {
Cons(x,_) => println!("{}",x),
Nil => ()
}
我认为Nil也是一个临时值,在语句结束时丢弃,但它运行良好,list和lista有什么区别?
1条答案
按热度按时间qnzebej01#
这是因为rvaue static promotion。所有常量值的枚举变量都是constexpr,因此被提升为
'static
生存期。例如:
产出:
只有
Dynamic
变量在创建时存储在新地址中,您也可以看到它具有显式的生存期:因此,代码在使用
Nil
时可以正常工作的原因是,引用的Nil
值不会在语句之后被删除,因为它位于'static
内存中,所以永远不会被删除。