当前位置:  开发笔记 > 后端 > 正文

为什么需要绑定`T:'a`来存储引用`&'a T`?

如何解决《为什么需要绑定`T:'a`来存储引用`&'aT`?》经验,为你挑选了2个好方法。

鉴于此代码:

struct RefWrapper<'a, T> {
    r: &'a T,
}

...编译器抱怨:

错误:参数类型T可能活不够长

考虑添加显式生命周期绑定,T: 'a以便引用类型&'a T不会超过它指向的数据.

我已经多次看过这个错误了,到目前为止我只是听了编译器,一切都很顺利.但是,考虑更多,我不明白为什么我要写T: 'a.

据我了解,已经不可能得到这样的参考.有&'a T暗示有类型的对象T是至少生存'a.但是我们不能在所述对象中存储任何引用,这些引用指向具有比生命周期短的数据'a.这已经导致编译错误.

在这个意义上它已经是不可能得到一个&'a T地方T不活得长'a.因此,附加注释(T: 'a)不应该是必需的.

我对吗?我错了,如果是的话:如果T: 'a不需要,我怎么能破坏代码呢?


链接:

RFC介绍语法

另一个可能相关的RFC

bluss.. 19

这是良构规则的一部分.该类型&'a T只有格式良好T: 'a("T outlives'a";它是必需的,因为我们有一个我们可以在范围内访问的引用'a;指向的值也T需要至少对该范围有效) .

struct RefWrapper<'a, T>是一种泛型类型,它表示您可以输入生命周期'x和类型URefWrapper<'x, U>返回类型.但是,除非要求T: 'a得到尊重,否则这种类型不一定是格式良好或甚至不能实施.

此要求来自实施细节; 它不一定使T'a一起使用像&'a T在结构的内部.良构性要求需要提升到结构的公共接口RefWrapper,因此形成RefWrapper<'_, _>类型的要求是公开的,即使内部实现不是.

(还有其他地方需要相同的要求,T: 'a但这是有意义的:

pub fn foo<'a, T>(x: &'a T) { }

我们发现了一个区别:这里的类型&'a T也是公共API的一部分.)



1> bluss..:

这是良构规则的一部分.该类型&'a T只有格式良好T: 'a("T outlives'a";它是必需的,因为我们有一个我们可以在范围内访问的引用'a;指向的值也T需要至少对该范围有效) .

struct RefWrapper<'a, T>是一种泛型类型,它表示您可以输入生命周期'x和类型URefWrapper<'x, U>返回类型.但是,除非要求T: 'a得到尊重,否则这种类型不一定是格式良好或甚至不能实施.

此要求来自实施细节; 它不一定使T'a一起使用像&'a T在结构的内部.良构性要求需要提升到结构的公共接口RefWrapper,因此形成RefWrapper<'_, _>类型的要求是公开的,即使内部实现不是.

(还有其他地方需要相同的要求,T: 'a但这是有意义的:

pub fn foo<'a, T>(x: &'a T) { }

我们发现了一个区别:这里的类型&'a T也是公共API的一部分.)



2> Shepmaster..:

恭喜,您说得对!从Rust 1.31开始,由于使用RFC 2093,推断T: 'x对结构的要求超过了要求,而用户键入此限制的要求已被删除:

无需T: 'x在结构上使用显式注释。我们将根据结构的字段推断它们的存在。总之,如果该结构包含一个参考,直接或间接地,以T与寿命'x,那么我们将推断T: 'x是一个要求

基本上,在任何情况下都不需要这样做,因此强制程序员将其写出没有太大价值。

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有