尝试理解在 where 子句中通过生命周期绑定类型的含义。
我目前的理解是,它对类型参数化的每个生命周期都进行了脱糖处理。
例如,
&'a T: 'b
将脱糖为'a: 'b
,因为&
在1个生命周期内被参数化,而i32: 'a
脱糖为空,因为没有生命周期参数(因此它始终成立)。
对 rustc 实现有更深入了解的人可以证实这一点吗?如果存在细微差别/差异并且这些不等同,请纠正我的理解。
示例:
fn test<'a, T: ?Sized>(p: &'a T)
where
&'a i32: 'static,
{
}
fn test2<'a, T: ?Sized>(p: &'a T)
where
'a: 'static,
{
}
fn main() {
let string = String::from("hello");
test(&string);
test2(&string);
}
两次调用均因相同错误而失败。
test
中边界中使用的 i32 类型与我传递的具体类型无关。
是的,
T: 'a
意味着T
中的所有引用也必须存活很长时间,因此&'a X: 'b
意味着'a
必须比'b
活得更久。如果一个值要在一生中有效,那么其中的所有引用也必须至少存在同样长的时间,否则您的值将无效。