主要观点:
- 深入探讨 Rust 中“临时值”(temporaries)的概念,包括其定义、创建条件、生命周期等。
- 通过多个示例解释了在不同场景下临时值的行为,如在
let
语句、引用操作等中的表现。 - 提及了常量提升(constant promotion)和生命周期扩展(lifetime extension)对临时值的影响。
关键信息:
- 临时值是在特定上下文(如值表达式在位置表达式上下文中)创建的无名内存位置,其值被放置其中,通常在封闭语句结束时被丢弃。
- 位置表达式表示内存位置,值表达式表示实际值,
let
语句的右侧等是位置表达式上下文。 - 常量提升条件:表达式可在编译时求值、无析构函数、无内部可变性。
- 生命周期扩展是临时值的特殊情况,有时会将临时值的生命周期扩展到包含
let
语句的块的范围,基于模式和表达式有不同的扩展情况。
重要细节:
- 示例代码如
struct Foo; impl Drop for Foo { fn drop(&mut self) {} } fn main() { let x = Some(&Foo); x; }
中,由于Foo
未实现Drop
且无内部可变性,可被提升为'static
,&Foo
返回对静态值的引用。 - 在
let x = &Foo; x;
中,&Foo
是扩展表达式,Foo
的临时内存位置生命周期被扩展到main
块。 - 而在
let x = Some(&Foo); x;
中,Some(&Foo)
是扩展表达式,但&Foo
不是,无生命周期扩展,Foo
的临时值在let
语句结束时丢弃。 - 对于模式扩展,如
let ref x = Foo(Bar).0;
,ref x
是扩展模式,Foo(Bar).0
的生命周期被扩展。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。