fn foo<'a>(x: &'a i32, y: &'a i32) {}
fn main() {
let a = 123;
{
let b = 234;
foo(&a, &b);
}
}在上面的代码中,&a和&b应该是具有不同生存期的引用。
编译器如何推断foo的生命周期变量'a?据我所知,它没有使用标准的Hindley-Milner统一算法。生存期必须是两个生存期的内部作用域或某个交集。
生命周期推断是与标准类型推断完全不同的过程吗?
编译器是使用交集类型还是使用生命周期之间的一些子类型关系来选择最受限制的生命周期?
发布于 2017-04-22 03:18:06
Rust使用改进的Hindley-Milner统一算法,因为它具有子类型关系。
例如,对于任何'a,&'static T都是&'a T的子类型。
您的情况相对简单,当编译器看到调用foo(&a, &b)时,它只是将'a统一为两个生存期中限制最多的一个(这是交叉点,因为现在生存期是词法的)。
https://stackoverflow.com/questions/43543407
复制相似问题