直接回答:三条省略规则:一,每个引用参数各自获得一个独立的生命周期参数;二,如果只有一个输入生命周期,它被赋给所有输出引用;三,方法中有 &self&mut self 时,self 的生命周期赋给所有输出。三条用完输出生命周期仍无法唯一确定时,编译器报 ambiguity,必须手写标注。标注的意义不是延长或缩短生命,而是向编译器声明输出引用与哪个输入引用同寿

展开解析:看典型例子:fn first(s: &str, t: &str) -> &str 会报错,因为两个输入两个候选,编译器不知道返回的引用借自谁——调用处若 s 先析构而返回值还活着就悬垂了。写成 fn first<'a>(s: &'a str, t: &'a str) -> &'a str 表示返回借自两者中较短的那个。结构体持有引用也必须标注:struct Ref<'a> { s: &'a str } 声明结构体不能比其引用活得更久。'static 是特殊的全程序期,&'static str 常见于字面量;T: 'static 约束出现在 thread::spawn 等场景,含义是不含非 'static 借用。实践中先把代码写对,报错后再加标注,比一开始就堆标注顺畅。

追问方向:为什么函数签名不需要 for<'a> 而 trait 有时需要 HRTB?lifetime 省略在闭包上为何不适用?

(约 460 字)