T<'a>: 'b 是 'a: 'b 的语法糖吗?

问题描述 投票:0回答:1

尝试理解在 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 类型与我传递的具体类型无关。

rust borrow-checker type-bounds
1个回答
0
投票

是的,

T: 'a
意味着
T
中的所有引用也必须存活很长时间,因此
&'a X: 'b
意味着
'a
必须比
'b
活得更久。如果一个值要在一生中有效,那么其中的所有引用也必须至少存在同样长的时间,否则您的值将无效。

© www.soinside.com 2019 - 2024. All rights reserved.