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

2024-02-28

鉴于此代码:

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

...编译器抱怨:

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

考虑添加显式生命周期界限T: 'a这样引用类型&'a T不会比它所指向的数据更长久。

我已经多次看到这个错误,到目前为止我只是听了编译器的声音,一切都很顺利。然而,再想一想,我就不明白了why我必须写T: 'a.

据我了解,这是already不可能得到这样的参考。拥有&'a T意味着存在一个类型的对象T至少存活'a。但是我们不能在该对象中存储任何指向生命周期短于'a。这个会already导致编译器错误。

从这个意义上说,已经不可能获得&'a T where T不会过时'a。因此附加注释(T: 'a)应该没有必要。

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


Links:

  • RFC 介绍语法 https://github.com/rust-lang/rfcs/blob/master/text/0192-bounds-on-object-and-generic-types.md
  • 另一个可能相关的 RFC https://github.com/rust-lang/rfcs/blob/master/text/1214-projections-lifetimes-and-wf.md

这是格式良好规则的一部分。方式&'a T仅当T: 'a(“T 比 'a” 寿命更长;这是必需的,因为我们有一个可以在范围内访问的引用'a;中的指向值T也需要至少在该范围内有效)。

struct RefWrapper<'a, T>是一个通用类型,它说你可以输入一个生命周期'x和一个类型U并得到一个RefWrapper<'x, U>输入回来。然而,这种类型不一定是格式良好的,甚至不一定是实现的,除非有要求T: 'a受到尊重。

这个要求来自于一个实现细节;不一定是这样T and 'a一起使用就像&'a T在结构的内部。良好成形性要求需要提升到公共接口RefWrapperstruct,以便形成一个RefWrapper<'_, _>类型是公共的,即使内部实现不是公共的。

(还有其他地方有同样的要求T: 'a返回但是隐式的:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么需要绑定 `T: 'a` 来存储引用 `&'a T`? 的相关文章

随机推荐

  • 如何在vba中另存为.txt

    我希望让我的宏将我创建的新工作表保存为 txt 文件 这是我到目前为止的代码 Sub Move Move Macro Keyboard Shortcut Ctrl m Sheets Sheet1 Select Range A1 Select
  • 绘制完成后清除CGPath路径

    我已经在 iOS 中编写了一个在 TouchMoved 方法中绘图的程序 CGContextAddPath UIGraphicsGetCurrentContext path CGPathMoveToPoint path NULL lastP
  • OpenCV - Java:inRange 函数

    我有我的形象mRgba当我这样做时 Core inRange mRgba B1 B2 mRgba 我得到了我期望的结果 我的所有 RGBA 图像的阈值都在 B1 和 B2 之间 现在我想这样做 Mat roi mRgba submat re
  • Pytorch:获取最终层的正确尺寸

    Pytorch 新手来了 我正在尝试微调 VGG16 模型来预测 3 个不同的类别 我的部分工作涉及将 FC 层转换为 CONV 层 但是 我的预测值不会落在 0 到 2 3 个类别 之间 有人可以向我指出有关如何计算最后一层的正确尺寸的好
  • pyder 中的 Python 调试器在第 2 行停止

    当我尝试调试代码时 调试器在第 2 行停止并且不响应任何命令 例如转到下一行 我正在使用 python 3 9 7 This is what the console looks like If I try to stop the debug
  • 无法加载共享库“libgdiplus” - Docker [带有 Aspose API 的 .NET 应用程序]

    当我创建用于部署的 docker 文件时 应用程序通常在开发环境中工作 但它失败了libgdiplus issue Docker文件 FROM mcr microsoft com dotnet core aspnet 3 0 AS base
  • 具有并排输入字段的 HTML 表单

    我有一个基本上是垂直的 html 表单 但我真的不知道如何在同一行上创建两个文本字段 例如 下面的表格我希望名字和姓氏在同一行 而不是一个在另一个下面
  • 将 UIButton 锚定到 UITableViewController 视图的底部

    我有以下要求 当一个UITableViewController显示的视图中 行数是可变的 在行下方 应显示一个按钮 当行数较小时 按钮应固定在视图的底部 当行数较多时 删除按钮应紧接在最后一行之后放置 换句话说 And not 到目前为止
  • CSS,位置:绝对,滚动条

    假设有一个页面 div div LEFT div div RIGHT div div 为什么水平滚动条只考虑右溢出 换句话说 为什么 LEFT 不触发滚动条 而 RIGHT 却触发呢 除了body gt overflow hidden 对于
  • 获得平均系数和 adj。使用 lapply 来自多个合并回归的 R^2

    我使用循环函数执行了多个池回归 并将回归输出存储在列表中 myregression 我现在想做的是对我的所有回归 即 myregression 列表 有效地执行 lmtest 包中的 coeftest 函数 以调整标准误差和 t 统计量 最
  • Python 中的梯形波

    如何用Python生成梯形波 我研究了 SciPy 和 NumPy 等模块 但没有成功 是否有像 scipy signal gaussian 这样的模块返回代表高斯函数波的值数组 我使用梯形内核生成了这个Astropy https en w
  • 加载图像时 WPF 抛出“无法定位资源”异常

    我有一个 WPF 窗口 其中包含本地系统中一个文件的背景图像 所以 XAML 文件看起来像这样
  • 增量熵计算

    Let std vector
  • 在迭代期间更改 HashMap 键

    是否可以在迭代过程中更改同一个 HashMap 实例的键 因为地图条目集没有方法entry setKey 现在我能想到的是创建另一个 HashMap MultipartParsingResult parsingResult parseReq
  • 如何在 D3 Javascript 中单击节点时显示和隐藏链接和节点

    我正在尝试遵循此 D3 Javascript 链接 gt http bl ocks org mbostock 1093130 http bl ocks org mbostock 1093130了解点击事件的工作原理 我想做的是 当单击蓝色节
  • 如何将所有项目模板数据设置到 Xamarin Carousel 中的单个视图中

    我尝试将 itemtemplate 中的所有项目制作为单个视图 如下图所示 如何使用 Xamarin CarouselView 实现此目的 我正在使用这样的 carousel new CarouselView carousel Bindin
  • 如何只在部分网站上实现HTTPS?

    我想知道 如何在网站的某一部分实现HTTPS 比方说 我想创建网上商店 我希望能够在没有 HTTPS 的情况下浏览所有项目 这样更快 对吧 当我想要付款时 我想使用 HTTPS 正如我在其他文章中读到的那样 当 IIS 配置为使用 HTTP
  • java中'Float a = 3f'和'Float a = 3.0'有什么区别?

    如果我表演 97346822 3f result is 2 9204048E8 however 97346822 3 0 gives me 2 92040466E8 请解释 号码3 0 is the 字面表示 http docs oracl
  • gcc 在链接时忽略符号名称的大小写

    我正在开发的一个软件使用全小写符号名称将 NETLIB BLAS LAPACK 嵌入到其源代码中 但现在将应用程序移植到 Windows 时我发现 Intel MKL 和该平台的其他几个 BLAS LAPACK 实现使用全大写符号名称 有没
  • 为什么需要绑定 `T: 'a` 来存储引用 `&'a T`?

    鉴于此代码 struct RefWrapper lt a T gt r a T 编译器抱怨 错误 参数类型T可能活得不够长 考虑添加显式生命周期界限T a这样引用类型 a T不会比它所指向的数据更长久 我已经多次看到这个错误 到目前为止我只