一个类型具有静态生命周期是什么意思?

6
我理解 borrow、trait 或 struct 具有生命周期的意义,但我不明白为什么类型会具有生命周期。 我对类型的理解是它们是在编译时使用的抽象概念,它们在二进制中根本不需要存在。例如,一个具有两个整数的结构体、一个由两个整数组成的元组和一个大小固定的含两个整数的数组在编译后都应该映射到相同的内存值布局,并且代码将使用字节偏移量来查找这两个值。如果我的理解正确,那么生命周期的概念根本不应该适用于类型,因此下面这两个结构体将是等价的:
pub struct Foo<T> {
    foo: T
}

pub struct Bar<T: 'static> {
    bar: T
}

除了等效之外,该语法根本不存在。我一定误解了什么,大量的谷歌搜索也没有帮助。类型生命周期的目的是什么,它们应该在什么时候使用?


请参见此处的最后一段落,了解有关 T 的生命周期限制。还可以查看 RFC 0192 以获取有关对象和泛型类型限制的信息。 - Dimitris Fasarakis Hilliard
我读了那个页面,直到那个点之前都很有道理。看起来奇怪的是,我能想到的任何应用程序都可以通过对值施加约束来处理这种约束。例如,当闭包借用某些东西以便返回对它的引用时,闭包的生命周期仅限于该借用的生命周期,但闭包的类型仍应永久存在。 - Lionel Foxcroft
1个回答

6

T可以携带比'static更短的生命周期。例如,T可能是一些&'a str(对于一些'a),因此Foo<T>变成了Foo<&'a str>,因此有一个绑定到'a的限制,这个限制可能'static更短。

第一个定义接受任何T并将其绑定在T的生命周期中。第二个定义表示T不得包含比'static更短的生命周期(T可以是&'static strString或任何其他'static的东西)。


好的,我认为这有道理。如果我理解正确,类型的生命周期并不意味着当生命周期结束时该类型变得无效,而是意味着填充该类型的值具有可能过期的关联生命周期。因此,当结构体拥有包含借用数据的内容时,会使用它来强制执行结构体实例不会超过其拥有的带有借用值的值。我理解的对吗? - Lionel Foxcroft
编译器将确定 Foo<T> 的生命周期限制适用于任何 T,包括如果 T 包含比 'static 更短的生命周期。如果您为某个 'a 构造了 Foo<&'a str>,然后尝试使用一些其他 &'b str 重新分配 T 的值,其中 'b'a 更短,编译器将报错。 - user2722968

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接