&'a T 是否意味着 T: 'a?

2023-12-31

从我自己的理解和实验来看,这似乎是正确的,但我还没有找到记录它的权威来源。 Rust by Example 有一个bounds https://doc.rust-lang.org/rust-by-example/scope/lifetime/lifetime_bounds.html部分说:

T: 'a:所有参考文献T必须比生命更长久'a.

#[derive(Debug)]
struct Ref<'a, T: 'a>(&'a T);
// `Ref` contains a reference to a generic type `T` that has
// an unknown lifetime `'a`. `T` is bounded such that any
// *references* in `T` must outlive `'a`. Additionally, the lifetime
// of `Ref` may not exceed `'a`.

然而,这看起来像是一个糟糕的演示,因为T: 'a绑定似乎不影响的行为Ref。我所做的任何尝试都是为了构建一个T'a有或没有受到阻碍T: 'a。更重要的是,定义了通用参考without生命周期界限可以作为一个传递with it:

fn f<'a, T>(r: &'a T) {
    g(r) // this compiles
}

fn g<'a, T: 'a>(r: &'a T) {
    // ...
}

Rust 参考文献中的一些示例具有类似的结构通用参数 https://doc.rust-lang.org/reference/items/generics.html部分 (struct Ref<'a, T> where T: 'a { r: &'a T }),但没有详细说明。我浏览了那里的文档,那些关于参考文献和关于生命周期的文档,但找不到链接。

So does &'a T imply T: 'a?如果是这样,这在哪里记录?为什么这些资源有这种不必要的限制?如果没有,规则是什么?


Yes, &'a T确实意味着T: 'a.

总是要求引用对象的寿命必须超过引用的寿命,因为它对于安全构建是必要的。但是,在 Rust 1.31 之前,不会推断界限,必须显式提供,如下所示these https://stackoverflow.com/questions/38626644/why-does-the-rust-compiler-request-i-constrain-a-generic-type-parameters-lifeti 问题 https://stackoverflow.com/questions/41794800/why-is-the-bound-t-a-required-in-order-to-store-a-reference-a-t.

It was RFC #2093:推断寿命 https://github.com/rust-lang/rfcs/blob/master/text/2093-infer-outlives.md让编译器推断这些边界,从而允许用户忽略它们。从那时起,Rust by Examples 和 Rust Reference 片段就被过度指定,并且T: 'a不再需要。

请参阅参考资料中的其他地方特质和寿命界限 https://doc.rust-lang.org/beta/reference/trait-bounds.html#implied-bounds:

有时会推断出类型良好形成所需的生命周期界限。

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

类型参数T需要比'a对于类型&'a T格式良好。这是推断出来的,因为函数签名包含类型&'a T仅当以下情况下才有效T: 'a holds.


至少有一个地方&'a T不会自动推断T: 'a那就是在为特征定义关联类型时()但编译器会引导您显式添加它:

trait MakeRef<'a> {
    type Type;
}

impl<'a, T> MakeRef<'a> for Vec<T> {
    type Type = &'a T;
}
error[E0309]: the parameter type `T` may not live long enough
 --> src/lib.rs:6:17
  |
6 |     type Type = &'a T;
  |                 ^^^^^ ...so that the reference type `&'a T` does not outlive the data it points at
  |
help: consider adding an explicit lifetime bound...
  |
5 | impl<'a, T: 'a> MakeRef<'a> for Vec<T> {
  |           ++++
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

&'a T 是否意味着 T: 'a? 的相关文章

随机推荐

  • 使用 ruby​​ 加密数据,使用 Node 解密

    我想在 ruby 应用程序中加密一些数据 然后在 nodejs 应用程序中对其进行解码 我一直在尝试让它发挥作用 现在我只是尝试用两种语言加密同一段数据以获得相同的结果 但我似乎无法做到这一点 js var crypto require c
  • 在 Log4j2 中扩展 PatternLayout

    自从 Log4J2 以来org apache logging log4j core layout PatternLayout班级是final 我无法扩展它来为我的创建标头CSV 我引用了文档 它没有提供有关如何扩展现有布局的信息 http
  • 具有状态存储的 Kafka Streams - 应用程序重新启动时重新处理消息

    我们有以下带有两个变压器的拓扑 每个变压器都使用持久状态存储 kStreamBuilder stream inboundTopicName transform gt new FirstTransformer FIRST STATE STOR
  • 将文件添加到单击一次部署

    我有一个要转移到 ClickOnce 的应用程序 该应用程序有一个大小适中的数据文件夹 其中包含我需要在部署中包含的数百个文件 部署后 该文件夹需要位于与 EXE 相同的位置 我已经看到了一些关于如何执行此操作的建议 但似乎没有达成一致的方
  • og 元标签、社交按钮和 angularjs

    我正在创建一个使用多个视图的网站 标签和页面的标签通过 rootScope 变量进行更改 所以我有类似的东西 每当每个视图加载到网站上时 page title 变量都会发生变化 标题和 og title 标签也会更新 一切都按预期工作 问题
  • 使用特定 SVN 版本时,PIP 总是重新安装包

    当指定特定 SVN 修订版时 PIP 始终下载并安装包 显着减慢同步过程 有没有解决的办法 正常情况下pip会检测到环境中已经安装了该包并提示使用 upgrade 我的 pip requirements 文件具有以下行 svn http c
  • SymEnumSymbols 返回 ERROR_SUCCESS 但没有给出结果

    我正在尝试从已加载的 DLL 中枚举符号 对于那些有兴趣的人来说 这是CPC覆盖项目 https github com atlaste CPPCoverage 对于某些功能我需要符号数据 问题分解 当进程启动或加载 DLL 时 需要为已计划
  • 如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

    当我在 Xcode 7 中编辑约束时 我发现标识符Interface Builder 中的字段 约束的标识符是什么 如何使用它 使用标识符我可以以编程方式访问约束并更改常量吗 我的问题是该标识符为什么有帮助以及有何帮助 有没有办法通过在子视
  • 如何使用带有空格键的 Bootstrap Tags 输入插件提交标签?

    我正在构建一个带有字段的表单 该字段使用Bootstrap标签输入插件 http timschlechter github io bootstrap tagsinput examples 一旦用户单击该插件 该插件就会输入一个标签Enter
  • 获取列表中函数的名称

    我希望实现什么 所以我想在函数列表中获取函数的名称 这是一个例子 foo list foo1 sum foo2 mean 我想从中提取什么foo is list sum mean 我希望它是一个函数 意思是 gt foo list foo1
  • 使用反射从dll调用方法后获取返回值

    我正在使用反射加载 dll 并尝试调用返回List
  • TPL DataFlow处理异常的正确方法

    我在使用 TPL DataFlow 管理队列 数据库 并将工作重定向到网格计算服务的 Windows 服务中遇到问题 在某一时刻 BufferBlock 停止释放任务 我不知道为什么 我认为这是因为在执行某些任务期间发生了一些异常 但它们被
  • Laravel 基本 HTTP 身份验证检查返回 False

    我使用 Laravel 中提供的基本 HTTP 身份验证来登录我的网站 然而 当我打电话时Auth Check 我总是得到false即使我已登录 也会得到响应 Does Auth Check 不适用于基本身份验证模型 如果不能 是否有任何方
  • 函数返回 Ajax 响应 - 值未定义? jQuery Ajax [重复]

    这个问题在这里已经有答案了 当我警告 jsonServerResponse 函数返回的值时 它的值是未定义的 尽管 JSON 是从 process php 页面返回的 function jsonServerResponse operatio
  • nginx:access.log 和 error.log 文件为空

    我刚刚使用命令在 Ubuntu 14 04 上安装了 nginx sudo apt get install nginx 现在 当我打开浏览器并输入地址时localhost然后我正确地显示了 欢迎来到 nginx 页面 另外 我检查了位于的配
  • Firebase 数据库未找到类错误 (NoClassDefFoundError)

    我有一个使用多个子模块的大型项目 我已将 firebase 数据库依赖项添加到我的项目中包含的模块之一 当本地测试模块作为开放项目包含时 一切正常 当使用封闭模块构建时 我的模块是aar文件 我收到以下错误 java lang NoClas
  • 如何重命名 WordPress 管理仪表板上的 WooCommerce 选项卡下的菜单选项卡

    我需要帮助重命名 WordPress 管理上 woocommerce 选项卡下的选项卡菜单项 我们安装了一个插件 该插件显示为 woocommerce 选项卡上的子菜单 有人可以帮我解决这个问题吗 我发现下面的代码可以重命名选项卡菜单 但我
  • 属性不应返回数组

    是的 我知道这个问题之前已经讨论过很多次了 我阅读了有关这个问题的所有帖子和评论 但似乎仍然无法理解一些东西 MSDN 提供的解决此违规问题的选项之一是返回收藏 or an 界面这是由一个实现的收藏 在访问该属性时 无论它多么明显并不能解决
  • Flex 默认规则

    如何自定义 Flex 的默认操作 我发现类似 的内容 但当我运行它时 它显示 柔性扫描仪卡住 还有 规则仅添加一条规则 因此它也不起作用 我想要的是 comment comment return 1 default return 0 lt
  • &'a T 是否意味着 T: 'a?

    从我自己的理解和实验来看 这似乎是正确的 但我还没有找到记录它的权威来源 Rust by Example 有一个bounds https doc rust lang org rust by example scope lifetime li